sql >> Database >  >> RDS >> Mysql

Gids voor het ontwerpen van een database voor quiz in MySQL

Deze tutorial biedt volledige stappen voor het ontwerpen van een databaseschema van online tests en quizsystemen om de gebruikers, quizzen, vragen, antwoorden en takes te beheren. Het kan verder worden gebruikt om online testen of op quiz gebaseerde websites of applicaties te ontwikkelen.

Het entiteitsrelatiediagram of visueel databaseontwerp wordt hieronder weergegeven.

Afb. 1

Opmerkingen :Het beperkt zich tot alleen ingelogde gebruikers om de quiz te doen om spamming te voorkomen. De quizzen worden als kort beschouwd in vergelijking met tests.

U kunt ook de populaire tutorials bezoeken, waaronder How To Install MySQL 8 on Ubuntu, How To Install MySQL 8 on Windows, RBAC Database in MySql, Blog Database in MySql, Learn Basic SQL Queries in MySQL.

Quiz-database

De allereerste stap is het maken van de quizdatabase. Het kan worden gemaakt met behulp van de onderstaande query.

CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ik heb de tekenset utf8mb4 . gebruikt om een ​​breed scala aan karakters te ondersteunen.

Gebruikerstabel

In deze sectie zullen we de Gebruikerstabel . ontwerpen om gebruikersinformatie op te slaan. Dezelfde tabel kan worden gebruikt om de quiz-hosts met elkaar in verband te brengen, zodat de gebruikers hun eigen quizzen kunnen beheren en de takes kunnen volgen. Hieronder staat de beschrijving van alle kolommen van de gebruikerstabel.

Id Het unieke ID om de gebruiker te identificeren.
Voornaam De voornaam van de gebruiker.
Middelste naam De middelste naam van de gebruiker.
Achternaam De achternaam van de gebruiker.
Mobiel Het mobiele nummer van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
E-mail Het e-mailadres van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
Wachtwoordhash De wachtwoord-hash gegenereerd door het juiste algoritme. We moeten vermijden om gewone wachtwoorden op te slaan.
Host De vlag om aan te geven of de gebruiker een quiz kan hosten.
Geregistreerd bij Deze kolom kan worden gebruikt om de levensduur van de gebruiker met de applicatie te berekenen.
Laatste aanmelding Het kan worden gebruikt om de laatste login van de gebruiker te identificeren.
Inleiding De korte introductie van de hostgebruiker die moet worden weergegeven op de test- of quizpagina.
Profiel De details van de eigenaar die moeten worden weergegeven op de test- of quizpagina.

De gebruikerstabel met de juiste beperkingen is zoals hieronder weergegeven.

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) );

Quiz-tabel

In deze sectie zullen we de Quiz Table . ontwerpen om de quizgegevens op te slaan. Hieronder staat de beschrijving van alle kolommen van de quiztabel.

Id Het unieke ID om de quiz te identificeren.
Host-ID De host-ID om de quizhost te identificeren.
Titel De titel van de quiz die moet worden weergegeven op de quizpagina en de lijsten.
Metatitel De metatitel die moet worden gebruikt voor browsertitel en SEO.
Naaktslak De slug om de URL te vormen.
Samenvatting De samenvatting om de belangrijkste hoogtepunten te noemen.
Type Het type om onderscheid te maken tussen de test en de quiz.
Score De totale score van de quiz.
Gepubliceerd Het kan worden gebruikt om te bepalen of de test/quiz openbaar beschikbaar is.
Gemaakt op Het slaat de datum en tijd op waarop de test/quiz is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de test/quiz is bijgewerkt.
Gepubliceerd op Het slaat de datum en tijd op waarop de test/quiz is gepubliceerd.
Begint om Het slaat de datum en tijd op waarop de test/quiz begint en opent voor takes.
Eindigt op Het slaat de datum en tijd op waarop de test/quiz sluit voor takes.
Inhoud De kolom die wordt gebruikt om de test-/quizgegevens op te slaan.

De quiztabel met de juiste beperkingen is zoals hieronder weergegeven.

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);

Quiz-meta

De Quiz Meta Table kan worden gebruikt om aanvullende informatie van tests of quiz op te slaan, inclusief de quizbanner URL enz. Hieronder staat de beschrijving van alle kolommen van de Quiz Meta Table.

Id Het unieke ID om de quizmeta te identificeren.
Quiz-ID Het quiz-ID om de bovenliggende test/quiz te identificeren.
Sleutel De sleutel die de meta identificeert.
Inhoud De kolom die wordt gebruikt om de metadata van de quiz op te slaan.

De Quiz Meta Table met de juiste beperkingen is zoals hieronder getoond.

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;

Tabel met quizvragen

De Tabelvragentabel kan worden gebruikt om de vragen met betrekking tot tests en quizzen op te slaan. Hieronder staat de beschrijving van alle kolommen van de quizvragentabel.

Id Het unieke ID om de quizvraag te identificeren.
Quiz-ID Het quiz-ID om de bovenliggende test/quiz te identificeren.
Type Het type vraag. Het type kan een enkele keuze zijn (Ja/Nee), meerkeuze of selecteren. We kunnen ook typen als invoer en tekstgebied hebben voor het geval het resultaat van de quiz handmatige controle vereist.
Actief Vlag om aan te geven of de vraag actief is. Een quiz kan meerdere vragen hebben, maar alleen selectieve vragen blijven tegelijkertijd actief.
Niveau Het niveau van de vraag om te bepalen of deze gemakkelijk, gemiddeld of moeilijk is.
Score De score van een individuele vraag. We moeten ervoor zorgen dat alleen selectieve vragen tegelijk actief zijn en dat de totale score van de actieve vragen gelijk is aan de quizscore voordat we de quiz publiceren.
Gemaakt op Het slaat de datum en tijd op waarop de vraag is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de vraag is bijgewerkt.
Inhoud De kolom waarin de vraag is opgeslagen.

De quizvragentabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Tabel met quizantwoorden

De Tabel met quizantwoorden kan worden gebruikt om de antwoorden van single-choice, multiple-choice en select type vragen op te slaan. In het geval van een enkelvoudige vraag kunnen de antwoorden Ja en Nee zijn. Hieronder vindt u de beschrijving van alle kolommen van de Quiz Answer Table.

Id Het unieke ID om het quizantwoord te identificeren.
Quiz-ID Het quiz-ID om de bovenliggende test/quiz te identificeren.
Vraag-ID De vraag-ID om de bovenliggende vraag te identificeren.
Actief Vlag om aan te geven of het antwoord actief is.
Correct Vlag om aan te geven of het antwoord juist is.
Gemaakt op Het slaat de datum en tijd op waarop het antwoord is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het antwoord is bijgewerkt.
Inhoud De kolom waarin het antwoord is opgeslagen.

De quizantwoordtabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Tabel nemen

In deze sectie zullen we de Take Table . ontwerpen om de inschrijving en timing van gebruikerspogingen tot de quizzen te volgen. Hieronder staat de beschrijving van alle kolommen van de Take Table.

Id Het unieke ID om de take te identificeren.
Gebruikers-ID Het gebruikers-ID om de quiznemer te identificeren.
Quiz-ID De quiz-ID om de quiz te identificeren.
Status De status van de opname. Het kan worden ingeschreven, gestart, gepauzeerd, voltooid, gedeclareerd.
Score De totale score behaald door de gebruiker.
Gemaakt op Het slaat de datum en tijd op waarop de take is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de opname is bijgewerkt.
Begonnen om Het slaat de datum en tijd op waarop de take begon.
Klaar om Het slaat de datum en tijd op waarop de take is afgelopen.
Inhoud De kolom die wordt gebruikt om de take-opmerkingen op te slaan.

De Take-tabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Neem antwoordtabel

De Neem antwoordtabel kan worden gebruikt om de antwoorden op te slaan die door de gebruiker zijn geselecteerd tijdens het maken van de quiz. Bij een meerkeuzevraag kunnen er meerdere antwoorden zijn. Hieronder vindt u de beschrijving van alle kolommen van de Take Answer Table.

Id Het unieke ID om het take-antwoord te identificeren.
Neem id De take-ID om de quizpoging te identificeren.
Antwoord-ID De antwoord-ID om het quizantwoord te identificeren.
Actief Vlag om aan te geven of het antwoord actief is.
Gemaakt op Het slaat de datum en tijd op waarop het antwoord is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het antwoord is bijgewerkt.
Inhoud De kolom die wordt gebruikt om het antwoord op te slaan in het geval van vragen van het type invoer of tekstgebied.

De Take Answer-tabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Samenvatting

In deze zelfstudie hebben we het databaseontwerp van een quizsysteem besproken om de gebruikers, quizzen, vragen, antwoorden en quizpogingen op te slaan in de vorm van takes.

U kunt uw opmerkingen indienen om deel te nemen aan de discussie. Mogelijk bent u ook geïnteresseerd in het ontwerpen van de database van de toepassingen Blog en Poll &Survey.

Het volledige databaseschema is ook beschikbaar op GitHub.


  1. Vergelijking van de datum- en tijdgegevenstypen in SQL Server

  2. BESTEL DOOR de IN-waardelijst

  3. SQL MAX van meerdere kolommen?

  4. 3 vervelende I/O-statistieken die de prestaties van SQL-query's vertragen