Ten samouczek zawiera kompletne kroki do projektowania schematu bazy danych testów online i systemów quizów do zarządzania użytkownikami, quizami, pytaniami, odpowiedziami i próbami. Może być dalej używany do tworzenia witryn lub aplikacji do testów online lub quizów.
Diagram relacji encji lub wizualny projekt bazy danych pokazano poniżej.
Rys. 1
Notatki :Ogranicza się tylko do zalogowanych użytkowników, aby wziąć udział w quizie, aby uniknąć spamowania. Quizy są uważane za krótkie w porównaniu do testów.
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 quizów
Pierwszym krokiem jest stworzenie Bazy Quizów. Można go utworzyć za pomocą zapytania, jak pokazano poniżej.
CREATE SCHEMA `quiz` 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. Tej samej tabeli można użyć do powiązania hostów quizów, aby użytkownicy mogli zarządzać własnymi quizami i śledzić próby. 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 zorganizować quiz. |
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 hosta do wyświetlenia na stronie testu lub quizu. |
Profil | Dane właściciela, które mają być wyświetlane na stronie testu lub quizu. |
Tabela użytkownika z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`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 quizów
W tej sekcji zaprojektujemy Tabelę Quizów do przechowywania danych quizu. Poniżej znajduje się opis wszystkich kolumn tabeli quizów.
Identyfikator | Unikalny identyfikator do identyfikacji quizu. |
Identyfikator hosta | Identyfikator hosta do identyfikacji hosta quizu. |
Tytuł | Tytuł quizu, który ma być wyświetlany na stronie quizu i na 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 test od quizu. |
Wynik | Całkowity wynik quizu. |
Opublikowane | Może być użyty do określenia, czy test/quiz jest publicznie dostępny. |
Utworzono w | Przechowuje datę i godzinę utworzenia testu/quizu. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji testu/quizu. |
Opublikowano w | Przechowuje datę i godzinę opublikowania testu/quizu. |
Zaczyna się o | Przechowuje datę i godzinę rozpoczęcia testu/quizu i jego otwarcie na ujęcia. |
Kończy się o | Przechowuje datę i godzinę zakończenia testu/quizu dla prób. |
Treść | Kolumna używana do przechowywania danych testu/quizu. |
Tabela quizów z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`quiz` (
`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,
`score` 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_quiz_host` (`hostId` ASC),
CONSTRAINT `fk_quiz_host`
FOREIGN KEY (`hostId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Meta quizu
Metatabela quizu może być używana do przechowywania dodatkowych informacji o testach lub quizie, w tym adresu URL banera quizu itp. Poniżej znajduje się opis wszystkich kolumn metatablicy quizu.
Identyfikator | Unikalny identyfikator do identyfikacji meta quizu. |
Identyfikator quizu | Identyfikator quizu identyfikujący nadrzędny test/test. |
Klucz | Klucz identyfikujący meta. |
Treść | Kolumna używana do przechowywania metadanych quizu. |
Metatabela quizu z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`quiz_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_quiz` (`quizId` ASC),
UNIQUE INDEX `uq_quiz_meta` (`quizId` ASC, `key` ASC),
CONSTRAINT `fk_meta_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabela pytań quizowych
Tabela pytań do quizu może służyć do przechowywania pytań związanych z testami i quizami. Poniżej znajduje się opis wszystkich kolumn tabeli pytań quizowych.
Identyfikator | Unikalny identyfikator do identyfikacji pytania quizu. |
Identyfikator quizu | Identyfikator quizu identyfikujący nadrzędny test/test. |
Wpisz | Rodzaj pytania. Typ może być jednokrotny (Tak/Nie), wielokrotny lub wybrany. Możemy również ustawić typ jako wejście i obszar tekstowy na wypadek, gdyby wynik quizu wymagał ręcznego sprawdzenia. |
Aktywny | Oznacz, aby określić, czy pytanie jest aktywne. Quiz może zawierać kilka pytań, ale tylko wybrane pytania pozostają aktywne w danym momencie. |
Poziom | Poziom pytania, aby określić, czy jest łatwe, średnie czy trudne. |
Wynik | Wynik pojedynczego pytania. Przed opublikowaniem quizu powinniśmy upewnić się, że tylko wybrane pytania są aktywne, a całkowity wynik aktywnych pytań jest równy wynikowi quizu. |
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ń quizu z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`quiz_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`level` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_question_quiz` (`quizId` ASC),
CONSTRAINT `fk_question_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabela odpowiedzi do quizu
Tabela odpowiedzi do quizu może służyć do przechowywania odpowiedzi na pytania jednokrotnego, wielokrotnego wyboru i typu wyboru. W przypadku pytania jednokrotnego wyboru odpowiedzi mogą być tak i nie. Poniżej znajduje się opis wszystkich kolumn tabeli odpowiedzi quizu.
Identyfikator | Unikalny identyfikator identyfikujący odpowiedź quizu. |
Identyfikator quizu | Identyfikator quizu identyfikujący nadrzędny test/test. |
Identyfikator pytania | Identyfikator pytania do identyfikacji pytania nadrzędnego. |
Aktywny | Oznacz, aby określić, czy odpowiedź jest aktywna. |
Poprawnie | Oznacz, aby określić, czy odpowiedź jest poprawna. |
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 quizu z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`quiz_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`quizId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`correct` 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_quiz` (`quizId` ASC),
CONSTRAINT `fk_answer_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `quiz`.`quiz_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`quiz_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Weź stół
W tej sekcji zaprojektujemy Tabelę na przyjęcie aby śledzić rejestrację i czas prób uczestnictwa użytkowników w quizach. Poniżej znajduje się opis wszystkich kolumn tabeli Take Table.
Identyfikator | Unikalny identyfikator identyfikujący ujęcie. |
Identyfikator użytkownika | Identyfikator użytkownika identyfikujący uczestnika quizu. |
Identyfikator quizu | Identyfikator quizu identyfikujący quiz. |
Stan | Stan ujęcia. Można go zapisać, rozpocząć, wstrzymać, zakończyć, zadeklarować. |
Wynik | Całkowity wynik uzyskany przez użytkownika. |
Utworzono w | Przechowuje datę i godzinę utworzenia dubla. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji ujęcia. |
Rozpoczęto o | Przechowuje datę i godzinę rozpoczęcia ujęcia. |
Gotowe o | Przechowuje datę i godzinę zakończenia ujęcia. |
Treść | Kolumna służąca do przechowywania uwag do odbioru. |
Tabela z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`take` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`quizId` BIGINT NOT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`startedAt` DATETIME NULL DEFAULT NULL,
`finishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_take_user` (`userId` ASC),
CONSTRAINT `fk_take_user`
FOREIGN KEY (`userId`)
REFERENCES `quiz`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `quiz`.`take`
ADD INDEX `idx_take_quiz` (`quizId` ASC);
ALTER TABLE `quiz`.`take`
ADD CONSTRAINT `fk_take_quiz`
FOREIGN KEY (`quizId`)
REFERENCES `quiz`.`quiz` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Weź tabelę odpowiedzi
Zbierz tabelę odpowiedzi może służyć do przechowywania odpowiedzi wybranych przez użytkownika podczas rozwiązywania quizu. W przypadku pytania wielokrotnego wyboru może być wiele odpowiedzi. Poniżej znajduje się opis wszystkich kolumn tabeli Take Answer Table.
Identyfikator | Unikalny identyfikator identyfikujący odpowiedź typu take. |
Zbierz identyfikator | Id wykonania do identyfikacji próby quizu. |
Identyfikator odpowiedzi | Identyfikator odpowiedzi identyfikujący odpowiedź quizu. |
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 w przypadku pytań typu input lub textarea. |
Tabela odpowiedzi z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `quiz`.`take_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`takeId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` 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_take` (`takeId` ASC),
CONSTRAINT `fk_answer_take`
FOREIGN KEY (`takeId`)
REFERENCES `quiz`.`take` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_question` (`questionId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_question`
FOREIGN KEY (`questionId`)
REFERENCES `quiz`.`quiz_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `quiz`.`take_answer`
ADD INDEX `idx_tanswer_answer` (`answerId` ASC);
ALTER TABLE `quiz`.`take_answer`
ADD CONSTRAINT `fk_tanswer_answer`
FOREIGN KEY (`answerId`)
REFERENCES `quiz`.`quiz_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Podsumowanie
W tym samouczku omówiliśmy projekt bazy danych systemu Quiz do przechowywania użytkowników, quizów, pytań, odpowiedzi i prób quizów w formie ujęcia.
Możesz przesłać swoje uwagi, aby dołączyć do dyskusji. Możesz być również zainteresowany zaprojektowaniem bazy danych aplikacji Blog oraz Ankieta i ankieta.
Pełny schemat bazy danych jest również dostępny na GitHub.