Mysql
 sql >> Base de données >  >> RDS >> Mysql

Guide pour concevoir une base de données pour le quiz dans MySQL

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