sql >> Database teknologi >  >> RDS >> Mysql

Guide til designdatabase til quiz i MySQL

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


  1. Postgres Query Plan, hvorfor rækkeestimering er så forkert

  2. En databasemodel til en onlineundersøgelse. Del 2

  3. De 9 mest almindelige databasedesignfejl

  4. Ignorerer MySQL null-værdier på unikke begrænsninger?