Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przewodnik po projektowaniu bazy danych do quizu w MySQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz wiele wierszy podrzędnych w jeden wiersz MYSQL

  2. Jak działa MySQL CASE?

  3. Wolny czas startu MySQL w trybie GTID? Problemem może być rozmiar pliku dziennika binarnego

  4. Funkcja MySQL MOD() – Wykonaj operację Modulo w MySQL

  5. Jak zwiększyć wydajność MySQL AWS dwukrotnie w porównaniu z Amazon RDS przy tym samym koszcie?