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