Ce didacticiel fournit des étapes complètes pour concevoir un schéma de base de données de tests en ligne et de systèmes de quiz pour gérer les utilisateurs, les quiz, les questions, les réponses et les prises. Il peut également être utilisé pour développer des tests en ligne ou des sites Web ou des applications basés sur des quiz.
Le diagramme de relation d'entité ou la conception visuelle de la base de données est illustré ci-dessous.
Image 1
Remarques :Il est limité aux seuls utilisateurs connectés pour répondre au quiz afin d'éviter le spam. Les quiz sont considérés comme aussi courts que les tests.
Vous pouvez également consulter les didacticiels populaires, notamment Comment installer MySQL 8 sur Ubuntu, Comment installer MySQL 8 sur Windows, Base de données RBAC dans MySql, Base de données de blog dans MySql, Apprendre les requêtes SQL de base dans MySQL.
Base de données de quiz
La toute première étape consiste à créer la base de données de quiz. Il peut être créé à l'aide de la requête comme indiqué ci-dessous.
CREATE SCHEMA `quiz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
J'ai utilisé le jeu de caractères utf8mb4 pour prendre en charge un large éventail de caractères.
Tableau des utilisateurs
Dans cette section, nous allons concevoir la table des utilisateurs pour stocker les informations de l'utilisateur. Le même tableau peut être utilisé pour relier les hôtes de quiz afin que les utilisateurs puissent gérer leurs propres quiz et suivre les prises. Vous trouverez ci-dessous la description de toutes les colonnes de la table des utilisateurs.
Identifiant | L'identifiant unique pour identifier l'utilisateur. |
Prénom | Le prénom de l'utilisateur. |
Deuxième prénom | Le deuxième prénom de l'utilisateur. |
Nom de famille | Le nom de famille de l'utilisateur. |
Mobile | Le numéro de portable de l'utilisateur. Il peut être utilisé à des fins de connexion et d'enregistrement. |
L'adresse e-mail de l'utilisateur. Il peut être utilisé à des fins de connexion et d'enregistrement. | |
Hachage du mot de passe | Le hachage du mot de passe généré par l'algorithme approprié. Nous devons éviter de stocker des mots de passe simples. |
Hébergeur | L'indicateur permettant d'identifier si l'utilisateur peut héberger un quiz. |
Enregistré à | Cette colonne peut être utilisée pour calculer la durée de vie de l'utilisateur avec l'application. |
Dernière connexion | Il peut être utilisé pour identifier la dernière connexion de l'utilisateur. |
Introduction | La brève présentation de l'utilisateur hôte à afficher sur la page de test ou de quiz. |
Profil | Les détails du propriétaire à afficher sur la page de test ou de quiz. |
La table utilisateur avec les contraintes appropriées est illustrée ci-dessous.
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) );
Tableau de quiz
Dans cette section, nous allons concevoir le tableau de quiz pour stocker les données du quiz. Vous trouverez ci-dessous la description de toutes les colonnes du tableau de quiz.
Identifiant | L'identifiant unique pour identifier le quiz. |
Identifiant de l'hôte | L'identifiant de l'hôte pour identifier l'hôte du quiz. |
Titre | Le titre du quiz à afficher sur la page Quiz et les listes. |
Méta-titre | Le méta-titre à utiliser pour le titre du navigateur et le référencement. |
limace | Le slug pour former l'URL. |
Résumé | Le résumé pour mentionner les principaux faits saillants. |
Type | Le type à distinguer entre le test et le quiz. |
Score | Le score total du quiz. |
Publié | Il peut être utilisé pour identifier si le test/quiz est accessible au public. |
Créé à | Il stocke la date et l'heure auxquelles le test/quiz est créé. |
Mis à jour à | Il stocke la date et l'heure auxquelles le test/quiz est mis à jour. |
Publié à | Il stocke la date et l'heure auxquelles le test/quiz est publié. |
Commence à | Il stocke la date et l'heure auxquelles le test/quiz commence et s'ouvre pour les prises. |
Se termine à | Il stocke la date et l'heure auxquelles le test/quiz se termine pour les prises. |
Contenu | La colonne utilisée pour stocker les données du test/quiz. |
Le tableau de quiz avec les contraintes appropriées est illustré ci-dessous.
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);
Méta-questionnaire
Le Quiz Meta Table peut être utilisé pour stocker des informations supplémentaires sur les tests ou les quiz, y compris l'URL de la bannière du quiz, etc. Vous trouverez ci-dessous la description de toutes les colonnes du Quiz Meta Table.
Identifiant | L'identifiant unique pour identifier la méta du quiz. |
Identifiant du questionnaire | L'identifiant du quiz pour identifier le test/quiz parent. |
Clé | La clé identifiant la méta. |
Contenu | La colonne utilisée pour stocker les métadonnées du quiz. |
Le tableau méta du quiz avec les contraintes appropriées est illustré ci-dessous.
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;
Tableau des questions du quiz
Le tableau de questions du quiz peut être utilisé pour stocker les questions liées aux tests et aux quiz. Vous trouverez ci-dessous la description de toutes les colonnes du tableau des questions du quiz.
Identifiant | L'identifiant unique pour identifier la question du quiz. |
Identifiant du questionnaire | L'identifiant du quiz pour identifier le test/quiz parent. |
Type | Le type de question. Le type peut être un choix unique (Oui/Non), un choix multiple ou une sélection. Nous pouvons également avoir type comme entrée et zone de texte au cas où le résultat du quiz nécessiterait des vérifications manuelles. |
Actif | Indicateur pour identifier si la question est active. Un quiz peut comporter plusieurs questions, mais seules les questions sélectives restent actives à la fois. |
Niveau | Le niveau de la question pour déterminer si c'est facile, moyen ou difficile. |
Score | Le score d'une question individuelle. Nous devons nous assurer que seules les questions sélectives sont actives à la fois et que le score total des questions actives est égal au score du quiz avant de publier le quiz. |
Créé à | Il stocke la date et l'heure auxquelles la question est créée. |
Mis à jour à | Il stocke la date et l'heure auxquelles la question est mise à jour. |
Contenu | La colonne utilisée pour stocker la question. |
Le tableau des questions du quiz avec les contraintes appropriées est illustré ci-dessous.
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;
Tableau des réponses au quiz
Le tableau de réponses au quiz peut être utilisé pour stocker les réponses des questions à choix unique, à choix multiples et de type sélection. Dans le cas d'une question à choix unique, les réponses peuvent être Oui et Non. Vous trouverez ci-dessous la description de toutes les colonnes du tableau de réponses du quiz.
Identifiant | L'identifiant unique pour identifier la réponse au quiz. |
Identifiant du questionnaire | L'identifiant du quiz pour identifier le test/quiz parent. |
Identifiant de la question | L'identifiant de la question pour identifier la question parent. |
Actif | Drapeau pour identifier si la réponse est active. |
Correct | Indicateur pour identifier si la réponse est correcte. |
Créé à | Il stocke la date et l'heure auxquelles la réponse est créée. |
Mis à jour à | Il stocke la date et l'heure auxquelles la réponse est mise à jour. |
Contenu | La colonne utilisée pour stocker la réponse. |
Le tableau de réponses du quiz avec les contraintes appropriées est illustré ci-dessous.
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;
Prendre la table
Dans cette section, nous allons concevoir la Take Table pour suivre l'inscription et le moment des tentatives des utilisateurs aux quiz. Vous trouverez ci-dessous la description de toutes les colonnes de la table Take.
Identifiant | L'identifiant unique pour identifier la prise. |
Identifiant utilisateur | L'identifiant d'utilisateur pour identifier le participant au quiz. |
Identifiant du questionnaire | L'identifiant du quiz pour identifier le quiz. |
Statut | Le statut de la prise. Il peut être inscrit, démarré, mis en pause, terminé, déclaré. |
Score | Le score total obtenu par l'utilisateur. |
Créé à | Il stocke la date et l'heure auxquelles la prise est créée. |
Mis à jour à | Il stocke la date et l'heure auxquelles la prise est mise à jour. |
Commence à | Il stocke la date et l'heure auxquelles la prise a commencé. |
Terminé à | Il stocke la date et l'heure auxquelles la prise est terminée. |
Contenu | La colonne utilisée pour stocker les remarques de prise. |
La table de prise avec les contraintes appropriées est illustrée ci-dessous.
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;
Prendre le tableau des réponses
Le tableau de réponses peut être utilisé pour stocker les réponses sélectionnées par l'utilisateur lors du quiz. Dans le cas d'une question à choix multiples, il peut y avoir plusieurs réponses. Vous trouverez ci-dessous la description de toutes les colonnes de la table Take Answer.
Identifiant | L'identifiant unique pour identifier la prise de réponse. |
Prendre l'identifiant | L'identifiant de prise pour identifier la tentative de quiz. |
Identifiant de la réponse | L'identifiant de réponse pour identifier la réponse du quiz. |
Actif | Drapeau pour identifier si la réponse est active. |
Créé à | Il stocke la date et l'heure auxquelles la réponse est créée. |
Mis à jour à | Il stocke la date et l'heure auxquelles la réponse est mise à jour. |
Contenu | La colonne utilisée pour stocker la réponse en cas de questions de type input ou textarea. |
Le tableau Take Answer avec les contraintes appropriées est illustré ci-dessous.
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;
Résumé
Dans ce didacticiel, nous avons abordé la conception de la base de données d'un système de quiz pour stocker les utilisateurs, les quiz, les questions, les réponses et les tentatives de quiz sous forme de prises.
Vous pouvez soumettre vos commentaires pour participer à la discussion. Vous pourriez également être intéressé par la conception de la base de données des applications Blog et Poll &Survey.
Le schéma complet de la base de données est également disponible sur GitHub.