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. |
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.