sql >> Databáze >  >> RDS >> Mysql

Průvodce návrhem databáze pro kvíz v MySQL

Tento výukový program poskytuje kompletní kroky k návrhu databázového schématu online testů a kvízových systémů pro správu uživatelů, kvízů, otázek, odpovědí a testů. Může být dále použit k vývoji webových stránek nebo aplikací založených na online testování nebo kvízech.

Diagram vztahů entit nebo návrh vizuální databáze je uveden níže.

Obr. 1

Poznámky :Omezuje pouze na přihlášené uživatele, kteří mohou absolvovat kvíz, aby se zabránilo spamování. Kvízy jsou považovány za kratší než testy.

Můžete také navštívit oblíbené výukové programy včetně Jak nainstalovat MySQL 8 na Ubuntu, Jak nainstalovat MySQL 8 na Windows, Databáze RBAC v MySql, Databáze blogu v MySql, Naučte se základní SQL dotazy v MySQL.

Databáze kvízů

Úplně prvním krokem je vytvoření kvízové ​​databáze. Lze jej vytvořit pomocí dotazu, jak je uvedeno níže.

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

Použil jsem znakovou sadu utf8mb4 pro podporu široké škály znaků.

Tabulka uživatelů

V této části navrhneme Tabulku uživatelů k ukládání uživatelských informací. Stejnou tabulku lze použít ke spojení hostitelů kvízů, takže uživatelé mohou spravovat své vlastní kvízy a sledovat výsledky. Níže je uveden popis všech sloupců tabulky uživatelů.

ID Jedinečné ID k identifikaci uživatele.
Křestní jméno Křestní jméno uživatele.
Prostřední jméno Prostřední jméno uživatele.
Příjmení Příjmení uživatele.
Mobil Číslo mobilního telefonu uživatele. Lze jej použít pro účely přihlášení a registrace.
E-mail E-mailová adresa uživatele. Lze jej použít pro účely přihlášení a registrace.
Hašování hesla Hash hash hesla vygenerovaný příslušným algoritmem. Musíme se vyhnout ukládání jednoduchých hesel.
Hostitel Příznak určující, zda uživatel může hostit kvíz.
Registrováno na Tento sloupec lze použít k výpočtu životnosti uživatele s aplikací.
Poslední přihlášení Lze jej použít k identifikaci posledního přihlášení uživatele.
Úvod Krátké představení hostitelského uživatele, které se zobrazí na testovací nebo kvízové ​​stránce.
Profil Podrobnosti vlastníka, které se mají zobrazit na stránce testu nebo kvízu.

Tabulka uživatelů s příslušnými omezeními je uvedena níže.

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

Kvízová tabulka

V této části navrhneme Kvízovou tabulku k uložení dat kvízu. Níže je uveden popis všech sloupců kvízové ​​tabulky.

ID Jedinečné ID pro identifikaci kvízu.
ID hostitele ID hostitele k identifikaci hostitele kvízu.
Název Název kvízu, který se zobrazí na stránce kvízu a v seznamech.
Název metadat Název metadat, který se má použít pro název prohlížeče a SEO.
Slimák Slim tvořící adresu URL.
Shrnutí Souhrn, ve kterém jsou zmíněny hlavní body.
Typ Typ pro rozlišení mezi testem a kvízem.
Skóre Celkové skóre kvízu.
Publikováno Lze jej použít ke zjištění, zda je test/kvíz veřejně dostupný.
Vytvořeno v Ukládá datum a čas, kdy byl test/kvíz vytvořen.
Aktualizováno dne Ukládá datum a čas, kdy je test/kvíz aktualizován.
Zveřejněno v Ukládá datum a čas, kdy je test/kvíz publikován.
Začíná v Ukládá datum a čas, kdy test/kvíz začíná a otevře se pro provedení.
Končí v Ukládá datum a čas, kdy se test/kvíz uzavírá.
Obsah Sloupec používaný k uložení dat testu/kvízu.

Kvízová tabulka s příslušnými omezeními je uvedena níže.

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 kvízu

Metatabulku kvízu lze použít k uložení dalších informací o testech nebo kvízech včetně adresy URL banneru kvízu atd. Níže je uveden popis všech sloupců metatabulky kvízu.

ID Jedinečné ID k identifikaci meta testu.
ID kvízu ID kvízu k identifikaci nadřazeného testu/kvízu.
Klíč Klíč identifikující meta.
Obsah Sloupec používaný k uložení metadat kvízu.

Metatabulka kvízu s příslušnými omezeními je uvedena níže.

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;

Tabulka kvízových otázek

Tabulka kvízových otázek lze použít k uložení otázek souvisejících s testy a kvízy. Níže je uveden popis všech sloupců tabulky kvízových otázek.

ID Jedinečné ID pro identifikaci kvízové ​​otázky.
ID kvízu ID kvízu k identifikaci nadřazeného testu/kvízu.
Typ Typ otázky. Typ může být jedna volba (Ano/Ne), více možností nebo výběr. Můžeme také mít typ jako vstup a textovou oblast v případě, že výsledek kvízu vyžaduje ruční kontrolu.
Aktivní Příznakem zjistíte, zda je otázka aktivní. Kvíz může mít několik otázek, ale současně zůstávají aktivní pouze selektivní otázky.
Úroveň Úroveň otázky k určení, zda je to snadné, střední nebo obtížné.
Skóre Skóre jednotlivé otázky. Před zveřejněním kvízu bychom se měli ujistit, že jsou aktivní pouze selektivní otázky a celkové skóre aktivních otázek se rovná skóre kvízu.
Vytvořeno v Ukládá datum a čas, kdy byla otázka vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je otázka aktualizována.
Obsah Sloupec používaný k uložení otázky.

Tabulka kvízových otázek s příslušnými omezeními je uvedena níže.

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;

Tabulka odpovědí na kvíz

Tabulka odpovědí na kvíz lze použít k uložení odpovědí na jednovýběrové, vícevýběrové a vybrané typy otázek. V případě otázky s jednou volbou mohou být odpovědi Ano a Ne. Níže je uveden popis všech sloupců tabulky odpovědí kvízu.

ID Jedinečné ID pro identifikaci odpovědi kvízu.
ID kvízu ID kvízu k identifikaci nadřazeného testu/kvízu.
ID otázky ID otázky k identifikaci nadřazené otázky.
Aktivní Příznakem zjistíte, zda je odpověď aktivní.
Správně Příznakem zjistíte, zda je odpověď správná.
Vytvořeno v Ukládá datum a čas, kdy byla odpověď vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je odpověď aktualizována.
Obsah Sloupec používaný k uložení odpovědi.

Tabulka odpovědí kvízu s příslušnými omezeními je uvedena níže.

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;

Vezměte si stůl

V této části navrhneme Převzít tabulku ke sledování registrace a načasování pokusů uživatelů o účast na kvízech. Níže je uveden popis všech sloupců tabulky Take Table.

ID Jedinečné ID pro identifikaci odběru.
ID uživatele ID uživatele k identifikaci účastníka kvízu.
ID kvízu ID kvízu pro identifikaci kvízu.
Stav Stav odběru. Může být zaregistrován, spuštěn, pozastaven, dokončen, deklarován.
Skóre Celkové skóre získané uživatelem.
Vytvořeno v Ukládá datum a čas, kdy byl snímek vytvořen.
Aktualizováno dne Ukládá datum a čas, kdy je záznam aktualizován.
Začalo v Ukládá datum a čas, kdy záznam začal.
Dokončeno v Ukládá datum a čas, kdy je pořízení dokončeno.
Obsah Sloupec používaný k ukládání poznámek k odběru.

Tabulka Take Table s příslušnými omezeními je uvedena níže.

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;

Vezměte si tabulku odpovědí

Převzít tabulku odpovědí lze použít k uložení odpovědí vybraných uživatelem při provádění kvízu. V případě otázky s výběrem z více odpovědí může existovat více odpovědí. Níže je uveden popis všech sloupců tabulky Take Answer Table.

ID Jedinečné ID pro identifikaci odpovědi přijmout.
Převzít ID ID odběru k identifikaci pokusu o kvíz.
ID odpovědi ID odpovědi pro identifikaci odpovědi kvízu.
Aktivní Příznakem zjistíte, zda je odpověď aktivní.
Vytvořeno v Ukládá datum a čas, kdy byla odpověď vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je odpověď aktualizována.
Obsah Sloupec používaný k uložení odpovědi v případě otázek typu vstupu nebo textové oblasti.

Tabulka Take Answer Table s příslušnými omezeními je uvedena níže.

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;

Shrnutí

V tomto tutoriálu jsme diskutovali o návrhu databáze kvízového systému pro ukládání uživatelů, kvízů, otázek, odpovědí a pokusů o kvízy ve formě pokusů.

Do diskuse můžete zasílat své komentáře. Také by vás mohl zajímat návrh databáze aplikací Blog a Poll &Survey.

Kompletní schéma databáze je k dispozici také na GitHubu.


  1. Jak monitorovat výkon PostgreSQL 12 pomocí OmniDB – část 2

  2. Jak převést primární klíč z celého čísla na sériový?

  3. Najděte maximální hodnotu a zobrazte odpovídající hodnotu z jiného pole na serveru SQL

  4. Konfigurace posluchače v databázi Oracle (edice 12c, 18c a 19c)