Denne vejledning indeholder komplette trin til at designe et databaseskema over onlinetests og quizsystemer til at administrere brugere, quizzer, spørgsmål, svar og besvarelser. Det kan yderligere bruges til at udvikle online test eller quizbaserede websteder eller applikationer.
Entity Relationship Diagram eller visuelle databasedesign er vist nedenfor.
Fig. 1
Noter :Det begrænser til kun loggede brugere at tage quizzen for at undgå spamming. Quizzerne anses for at være lige så korte sammenlignet med tests.
Du kan også besøge de populære selvstudier, herunder Sådan installeres MySQL 8 på Ubuntu, Sådan installeres MySQL 8 på Windows, RBAC-database i MySql, Blogdatabase i MySql, Lær grundlæggende SQL-forespørgsler i MySQL.
Quizdatabase
Det allerførste trin er at oprette Quiz-databasen. Den kan oprettes ved hjælp af forespørgslen som vist nedenfor.
CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Jeg har brugt tegnsættet utf8mb4 for at understøtte en bred vifte af tegn.
Brugertabel
I dette afsnit vil vi designe Brugertabellen at gemme brugeroplysninger. Den samme tabel kan bruges til at relatere quizværterne, så brugerne kan styre deres egne quizzer og spore take. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugertabellen.
Id | Det unikke id til at identificere brugeren. |
Fornavn | Brugerens fornavn. |
Mellemnavn | Brugerens mellemnavn. |
Efternavn | Brugerens efternavn. |
Mobil | Brugerens mobilnummer. Det kan bruges til login og registreringsformål. |
Brugerens e-mail. Det kan bruges til login og registreringsformål. | |
Password Hash | Adgangskodehashen genereret af den passende algoritme. Vi skal undgå at gemme almindelige adgangskoder. |
Vært | Flaget til at identificere, om brugeren kan være vært for en quiz. |
Registreret på | Denne kolonne kan bruges til at beregne levetiden for brugeren med applikationen. |
Sidste login | Det kan bruges til at identificere brugerens sidste login. |
Introduktion | Den korte introduktion af værtsbrugeren, der skal vises på test- eller quizsiden. |
Profil | Ejeroplysningerne, der skal vises på test- eller quizsiden. |
Brugertabellen med de relevante begrænsninger er som vist nedenfor.
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
I dette afsnit vil vi designe Quiztabellen for at gemme quizdataene. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Quiztabellen.
Id | Det unikke id til at identificere quizzen. |
Værts-id | Vært-id'et til at identificere quizværten. |
Titel | Quiztitlen, der skal vises på Quizsiden og listerne. |
Metatitel | Metatitlen, der skal bruges til browsertitel og SEO. |
Snegl | Sneglen til at danne URL'en. |
Oversigt | Opsummeringen for at nævne de vigtigste højdepunkter. |
Type | Typen til at skelne mellem testen og quizzen. |
Score | Det samlede resultat for quizzen. |
Udgivet | Det kan bruges til at identificere, om testen/quizzen er offentligt tilgængelig. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor testen/quizzen er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor testen/quizzen opdateres. |
Udgivet på | Den gemmer datoen og tidspunktet, hvor testen/quizzen udgives. |
Starter ved | Den gemmer datoen og klokkeslættet, hvor testen/quizzen starter, og åbner op for optagelser. |
Ender kl. | Den gemmer datoen og klokkeslættet, hvor testen/quizzen lukker for optagelser. |
Indhold | Kolonnen, der bruges til at gemme test-/quizdataene. |
Quiztabellen med de relevante begrænsninger er som vist nedenfor.
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
Quiz-metatabellen kan bruges til at gemme yderligere information om tests eller quiz, inklusive quiz-banner-URL'en osv. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Quiz-metatabellen.
Id | Det unikke id til at identificere quizzens meta. |
Quiz-id | Quiz-id'et til at identificere den overordnede test/quiz. |
Nøgle | Nøglen, der identificerer metaen. |
Indhold | Kolonnen, der bruges til at gemme quizzens metadata. |
Quiz-metatabellen med de relevante begrænsninger er som vist nedenfor.
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 med quizspørgsmål
Quiz-spørgsmålstabellen kan bruges til at gemme spørgsmålene i forbindelse med tests og quizzer. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Quiz-spørgsmålstabellen.
Id | Det unikke id til at identificere quizspørgsmålet. |
Quiz-id | Quiz-id'et til at identificere den overordnede test/quiz. |
Type | Spørgsmålstypen. Typen kan være et enkelt valg (Ja/Nej), multiple-choice eller vælg. Vi kan også have skrift som input og tekstområde, hvis quizresultatet skal kontrolleres manuelt. |
Aktiv | Flag for at identificere, om spørgsmålet er aktivt. En quiz kan have flere spørgsmål, men kun selektive spørgsmål forbliver aktive ad gangen. |
Niveau | Niveauet af spørgsmålet for at identificere, om det er let, medium eller svært. |
Score | Score for et individuelt spørgsmål. Vi bør sikre os, at kun selektive spørgsmål er aktive ad gangen, og den samlede score for de aktive spørgsmål er lig med quizzens score, før quizzen udgives. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor spørgsmålet oprettes. |
Opdateret kl. | Den gemmer dato og klokkeslæt, hvor spørgsmålet opdateres. |
Indhold | Kolonnen, der bruges til at gemme spørgsmålet. |
Quizspørgsmålstabellen med de relevante begrænsninger er som vist nedenfor.
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;
Quiz-svartabel
Quiz-svartabellen kan bruges til at gemme svarene på enkeltvalgs-, multiple-choice- og valgtypespørgsmål. I tilfælde af et enkeltvalgsspørgsmål kan svarene være Ja og Nej. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Quiz-svartabellen.
Id | Det unikke id til at identificere quizsvaret. |
Quiz-id | Quiz-id'et til at identificere den overordnede test/quiz. |
Spørgsmåls-id | Spørgsmåls-id'et til at identificere det overordnede spørgsmål. |
Aktiv | Flag for at identificere, om svaret er aktivt. |
Korrekt | Flag for at identificere, om svaret er korrekt. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor svaret er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor svaret er opdateret. |
Indhold | Kolonnen, der bruges til at gemme svaret. |
Quizsvarstabellen med de relevante begrænsninger er som vist nedenfor.
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;
Tag bordet
I dette afsnit vil vi designe Take-tabellen at spore tilmeldingen og timingen af brugernes forsøg på quizzerne. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Take Table.
Id | Det unikke id, der identificerer optagelsen. |
Bruger-id | Bruger-id'et til at identificere quiz-tageren. |
Quiz-id | Quiz-id'et til at identificere quizzen. |
Status | Status for optagelsen. Det kan tilmeldes, startes, pauses, afsluttes, erklæres. |
Score | Den samlede score opnået af brugeren. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor optagelsen er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor optagelsen opdateres. |
Begyndte kl. | Den gemmer datoen og klokkeslættet, hvor optagelsen startede. |
Afsluttet kl. | Den gemmer datoen og klokkeslættet, hvor optagelsen er færdig. |
Indhold | Kolonnen, der bruges til at gemme take-bemærkningerne. |
Take-tabellen med de relevante begrænsninger er som vist nedenfor.
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;
Tag svartabellen
Take svar-tabellen kan bruges til at gemme de svar, som brugeren har valgt, mens han tager quizzen. I tilfælde af et multiple choice-spørgsmål kan der være flere svar. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Take Answer-tabellen.
Id | Det unikke id til at identificere svaret. |
Tag id | Take-id'et til at identificere quizforsøget. |
Svar-id | Svar-id'et til at identificere quizsvaret. |
Aktiv | Flag for at identificere, om svaret er aktivt. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor svaret er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor svaret er opdateret. |
Indhold | Kolonnen, der bruges til at gemme svaret i tilfælde af input- eller tekstområde-spørgsmål. |
Take Answer-tabellen med de relevante begrænsninger er som vist nedenfor.
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;
Oversigt
I denne tutorial har vi diskuteret databasedesignet af et quizsystem til at gemme brugerne, quizzer, spørgsmål, svar og quizforsøg i form af take.
Du kan indsende dine kommentarer for at deltage i diskussionen. Du kan også være interesseret i at designe databasen med Blog- og Poll &Survey-applikationerne.
Det komplette databaseskema er også tilgængeligt på GitHub.