Ten samouczek zawiera kompletne kroki, aby zaprojektować schemat bazy danych zamkniętych lub otwartych ankiet i ankiet za pomocą kwestionariusza do zarządzania użytkownikami, ankietami, pytaniami, odpowiedziami i głosami. Może być dalej wykorzystany do stworzenia strony internetowej z ankietami lub aplikacji mobilnej.
Diagram relacji encji lub wizualny projekt bazy danych pokazano poniżej.
Rys. 1
Notatki :Aby zachować prostotę schematu bazy danych i stworzyć minimalny opłacalny produkt, nie obejmuje bardziej zaawansowanych opcji, takich jak wersjonowanie i przeglądanie ankiet i ankiet. Ogranicza się tylko do zalogowanych użytkowników do wzięcia udziału w ankiecie lub sondażu, aby uniknąć spamowania, dzięki czemu przesyłane są tylko uzasadnione głosy.
Możesz także odwiedzić popularne samouczki, w tym Jak zainstalować MySQL 8 w Ubuntu, Jak zainstalować MySQL 8 w systemie Windows, Baza danych RBAC w MySql, Baza danych blogów w MySql, Naucz się podstawowych zapytań SQL w MySQL.
Baza danych ankiet
Pierwszym krokiem jest stworzenie bazy danych ankiet. Można go utworzyć za pomocą zapytania, jak pokazano poniżej.
CREATE SCHEMA `poll` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Użyłem zestawu znaków utf8mb4 do obsługi szerokiej gamy znaków.
Tabela użytkowników
W tej sekcji zaprojektujemy Tabelę użytkowników do przechowywania informacji o użytkowniku właściciela ankiety/ankiety. Tej samej tabeli można użyć do powiązania właścicieli ankiet/ankiet, aby użytkownicy mogli zarządzać własną ankietą lub ankietą oraz śledzić działania związane z głosowaniem. Poniżej znajduje się opis wszystkich kolumn tabeli użytkowników.
Identyfikator | Unikalny identyfikator do identyfikacji użytkownika. |
Imię | Imię użytkownika. |
Drugie imię | Drugie imię użytkownika. |
Nazwisko | Nazwisko użytkownika. |
Komórka | Numer telefonu komórkowego użytkownika. Może być używany do celów logowania i rejestracji. |
Poczta e-mail | E-mail użytkownika. Może być używany do celów logowania i rejestracji. |
Hash hasła | Skrót hasła wygenerowany przez odpowiedni algorytm. Musimy unikać przechowywania zwykłych haseł. |
Host | Flaga określająca, czy użytkownik może prowadzić ankietę lub ankietę. |
Zarejestrowano w | Ta kolumna może być użyta do obliczenia życia użytkownika z aplikacją. |
Ostatnie logowanie | Może być używany do identyfikacji ostatniego logowania użytkownika. |
Wprowadzenie | Krótkie wprowadzenie użytkownika do wyświetlenia na stronie ankiety lub ankiety. |
Profil | Dane właściciela, które mają być wyświetlane na stronie ankiety lub ankiety. |
Tabela użytkownika z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`host` TINYINT(1) NOT NULL DEFAULT 0,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
Tabela ankiety
W tej sekcji zaprojektujemy Tabelę ankiety do przechowywania danych ankietowych i ankietowych. Poniżej znajduje się opis wszystkich kolumn tabeli ankiet.
Identyfikator | Unikalny identyfikator do identyfikacji ankiety/ankiety. |
Identyfikator hosta | Identyfikator hosta do identyfikacji hosta ankiety/ankiety. |
Tytuł | Tytuł ankiety/ankiety, który ma być wyświetlany na stronie ankiety/ankiety i listach. |
Metatytuł | Metatytuł używany do tytułu przeglądarki i SEO. |
Ślimak | Śruba do utworzenia adresu URL. |
Podsumowanie | Podsumowanie zawierające najważniejsze informacje. |
Wpisz | Typ odróżniający ankietę od ankiety. |
Opublikowane | Może być użyty do określenia, czy ankieta/ankieta jest publicznie dostępna. |
Utworzono w | Przechowuje datę i godzinę utworzenia ankiety/ankiety. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji ankiety/ankiety. |
Opublikowano w | Przechowuje datę i godzinę publikacji ankiety/ankiety. |
Zaczyna się o | Przechowuje datę i godzinę rozpoczęcia ankiety/ankiety i otwarcia do głosowania. |
Kończy się o | Przechowuje datę i godzinę zakończenia ankiety/ankiety w celu głosowania. |
Treść | Kolumna używana do przechowywania danych ankiety/ankiety. |
Tabela ankiet z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`poll` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`hostId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`startsAt` DATETIME NULL DEFAULT NULL,
`endsAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_poll_host` (`hostId` ASC),
CONSTRAINT `fk_poll_host`
FOREIGN KEY (`hostId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Meta ankiety
Metatabela ankiety może być używana do przechowywania dodatkowych informacji o ankiecie lub ankiecie, w tym adresu URL banera ankiety itp. Poniżej znajduje się opis wszystkich kolumn metatabeli ankiety.
Identyfikator | Unikalny identyfikator do identyfikacji meta ankiety. |
Identyfikator ankiety | Identyfikator ankiety do identyfikacji nadrzędnej ankiety/ankiety. |
Klucz | Klucz identyfikujący meta. |
Treść | Kolumna używana do przechowywania metadanych ankiety. |
Metatabela ankiety z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`poll_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_poll` (`pollId` ASC),
UNIQUE INDEX `uq_poll_meta` (`pollId` ASC, `key` ASC),
CONSTRAINT `fk_meta_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabela pytań do ankiety
Tabela pytań do ankiety może być używana do przechowywania pytań związanych z ankietami i ankietami. Idealnym scenariuszem jest posiadanie jednego pytania do ankiet i wielu pytań do ankiet. Poniżej znajduje się opis wszystkich kolumn tabeli pytań do ankiety.
Identyfikator | Unikalny identyfikator do identyfikacji pytania ankiety. |
Identyfikator ankiety | Identyfikator ankiety do identyfikacji nadrzędnej ankiety/ankiety. |
Wpisz | Rodzaj pytania. Typ może być pojedynczym wyborem (Tak/Nie), wielokrotnym wyborem, wyborem lub wejściem. |
Aktywny | Oznacz, aby określić, czy pytanie jest aktywne. |
Utworzono w | Przechowuje datę i godzinę utworzenia pytania. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji pytania. |
Treść | Kolumna używana do przechowywania pytania. |
Tabela pytań do ankiety z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`poll_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_question_poll` (`pollId` ASC),
CONSTRAINT `fk_question_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabela odpowiedzi na ankietę
Tabela odpowiedzi do ankiety może być używana do przechowywania odpowiedzi na pytania jednokrotnego, wielokrotnego wyboru i typu wyboru. W przypadku pytań jednokrotnego wyboru odpowiedzi mogą być tak i nie. Poniżej znajduje się opis wszystkich kolumn tabeli odpowiedzi do ankiety.
Identyfikator | Unikalny identyfikator do identyfikacji odpowiedzi w ankiecie. |
Identyfikator ankiety | Identyfikator ankiety do identyfikacji nadrzędnej ankiety/ankiety. |
Identyfikator pytania | Identyfikator pytania do identyfikacji pytania nadrzędnego. |
Aktywny | Oznacz, aby określić, czy odpowiedź jest aktywna. |
Utworzono w | Przechowuje datę i godzinę utworzenia odpowiedzi. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji odpowiedzi. |
Treść | Kolumna używana do przechowywania odpowiedzi. |
Tabela odpowiedzi do ankiety z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`poll_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_answer_poll` (`pollId` ASC),
CONSTRAINT `fk_answer_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `poll`.`poll_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabela głosowania w ankiecie
Tabela głosowania ankiety może służyć do przechowywania wyborów i danych wejściowych użytkownika. Poniżej znajduje się opis wszystkich kolumn tabeli głosowania w ankietach.
Identyfikator | Unikalny identyfikator identyfikujący głos w ankiecie. |
Identyfikator ankiety | Identyfikator ankiety do identyfikacji ankiety/ankiety. |
Identyfikator pytania | Identyfikator pytania do identyfikacji pytania. |
Identyfikator odpowiedzi | Identyfikator odpowiedzi identyfikujący odpowiedź. |
Identyfikator użytkownika | Identyfikator użytkownika do identyfikacji użytkownika. |
Utworzono w | Przechowuje datę i godzinę utworzenia odpowiedzi. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji odpowiedzi. |
Treść | Kolumna używana do przechowywania danych wejściowych użytkownika. |
Tabela głosowania z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`poll_vote` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT DEFAULT NULL,
`userId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_vote_poll` (`pollId` ASC),
CONSTRAINT `fk_vote_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_answer` (`answerId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_answer`
FOREIGN KEY (`answerId`)
REFERENCES `poll`.`poll_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_user` (`userId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_user`
FOREIGN KEY (`userId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabela kategorii i tabela kategorii ankiety
W tej sekcji zaprojektujemy Tabelę kategorii i Tabela kategorii ankiety do przechowywania kategorii ankiet i ich mapowań. Poniżej znajduje się opis wszystkich kolumn tabeli kategorii.
Identyfikator | Unikalny identyfikator do identyfikacji kategorii. |
Identyfikator rodzica | Identyfikator nadrzędny do identyfikacji kategorii nadrzędnej. |
Tytuł | Tytuł kategorii. |
Metatytuł | Metatytuł używany do tytułu przeglądarki i SEO. |
Ślimak | Narzędzie kategorii do utworzenia adresu URL. |
Treść | Kolumna używana do przechowywania danych kategorii. |
Tabela kategorii z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
ALTER TABLE `poll`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `poll`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Poniżej znajduje się opis wszystkich kolumn tabeli kategorii ankiety.
Identyfikator ankiety | Identyfikator ankiety do identyfikacji ankiety lub ankiety. |
Identyfikator kategorii | Identyfikator kategorii do identyfikacji kategorii. |
Tabela kategorii ankiety z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `poll`.`poll_category` (
`pollId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`pollId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_poll` (`pollId` ASC),
CONSTRAINT `fk_pc_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabela tagów i tabela tagów ankiety
Podobnie jak w przypadku tabel kategorii i ankiet, możemy zaprojektować Tabelę tagów i Tabela tagów ankiety . Poniżej wymieniono główne różnice między kategorią a tagiem.
- Kolumna parentId nie jest wymagana w tabeli tagów.
- Liczba kategorii pozostaje niska, ponieważ można ich użyć do utworzenia menu głównego do celów nawigacyjnych. Tagi mogą być większe w porównaniu z kategoriami.
- Do powiązania ankiet można użyć zarówno kategorii, jak i tagów.
- Do ankiety należy przypisać tylko kilka kategorii, podczas gdy liczba tagów może być większa.
Podsumowanie
W ten sposób możemy zaprojektować bazę danych ankiet, która będzie wykorzystywana do tworzenia witryn internetowych i aplikacji mobilnych opartych na ankietach i ankietach. To samo można dodatkowo ulepszyć, aby dodać bardziej zaawansowane opcje, w tym filmy, płatności, subskrypcje itp.
Możesz przesłać swoje uwagi, aby dołączyć do dyskusji. Możesz być również zainteresowany zaprojektowaniem bazy danych aplikacji Blog. Projekt RBAC można wykorzystać do implementacji kontroli dostępu opartej na rolach.
Pełny schemat bazy danych jest również dostępny na GitHub.