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

Guide pour concevoir une base de données pour les sondages et les enquêtes dans MySQL

Ce didacticiel fournit des étapes complètes pour concevoir un schéma de base de données de sondages et d'enquêtes fermés ou ouverts via un questionnaire pour gérer les utilisateurs, les sondages, les questions, les réponses et les votes. Il peut également être utilisé pour développer un site Web de sondage et d'enquête ou une application mobile.

Le diagramme de relation d'entité ou la conception visuelle de la base de données est illustré ci-dessous.

Image 1

Remarques :Pour garder le schéma de la base de données simple et développer un produit viable minimal, il ne couvre pas les options plus avancées telles que la gestion des versions et la révision des sondages et des enquêtes. Il limite aux seuls utilisateurs connectés la participation à une enquête ou à un sondage pour éviter le spam afin que seuls les votes légitimes soient soumis.

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 des sondages

La toute première étape consiste à créer la base de données de sondage. Il peut être créé à l'aide de la requête comme indiqué ci-dessous.

CREATE SCHEMA `poll` 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 utilisateur du propriétaire du sondage/de l'enquête. Le même tableau peut être utilisé pour relier les propriétaires de sondage/enquête afin que les utilisateurs puissent gérer leur propre sondage ou enquête et suivre les activités de vote. 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 sondage ou une enquête.
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 à afficher sur la page de sondage ou d'enquête.
Profil Les détails du propriétaire à afficher sur la page de sondage ou d'enquête.

La table utilisateur avec les contraintes appropriées est illustrée ci-dessous.

CREATE TABLE `poll`.`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 sondage

Dans cette section, nous allons concevoir la table de sondage pour stocker les données du sondage et de l'enquête. Vous trouverez ci-dessous la description de toutes les colonnes du tableau de sondage.

Identifiant L'identifiant unique pour identifier le sondage/enquête.
Identifiant de l'hôte L'identifiant de l'hôte pour identifier l'hôte du sondage/de l'enquête.
Titre Le titre du sondage/enquête à afficher sur la page Sondage/Enquête 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 sondage et l'enquête.
Publié Il peut être utilisé pour identifier si le sondage/enquête est accessible au public.
Créé à Il stocke la date et l'heure auxquelles le sondage/enquête est créé.
Mis à jour à Il stocke la date et l'heure auxquelles le sondage/enquête est mis à jour.
Publié à Il stocke la date et l'heure auxquelles le sondage/enquête est publié.
Commence à Il stocke la date et l'heure auxquelles le sondage/sondage commence et s'ouvre au vote.
Se termine à Il stocke la date et l'heure auxquelles le sondage/sondage se termine pour le vote.
Contenu La colonne utilisée pour stocker les données du sondage/de l'enquête.

La table de sondage avec les contraintes appropriées est illustrée ci-dessous.

CREATE TABLE `poll`.`poll` (
`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,
`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_poll_host` (`hostId` ASC),
CONSTRAINT `fk_poll_host`
FOREIGN KEY (`hostId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Méta sondage

La méta-table de sondage peut être utilisée pour stocker des informations supplémentaires sur un sondage ou une enquête, y compris l'URL de la bannière du sondage, etc. Vous trouverez ci-dessous la description de toutes les colonnes de la méta-table de sondage.

Identifiant L'identifiant unique pour identifier la méta du sondage.
Identifiant du sondage L'identifiant du sondage pour identifier le sondage/sondage parent.
Clé La clé identifiant la méta.
Contenu La colonne utilisée pour stocker les métadonnées du sondage.

La méta-table du sondage avec les contraintes appropriées est illustrée ci-dessous.

CREATE TABLE `poll`.`poll_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_poll` (`pollId` ASC),
UNIQUE INDEX `uq_poll_meta` (`pollId` ASC, `key` ASC),
CONSTRAINT `fk_meta_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Tableau des questions du sondage

La table des questions de sondage peut être utilisée pour stocker les questions liées aux sondages et aux enquêtes. Le scénario idéal est d'avoir une question pour les sondages et plusieurs questions pour les enquêtes. Vous trouverez ci-dessous la description de toutes les colonnes du tableau des questions du sondage.

Identifiant L'identifiant unique pour identifier la question du sondage.
Identifiant du sondage L'identifiant du sondage pour identifier le sondage/sondage parent.
Type Le type de question. Le type peut être un choix unique (Oui/Non), un choix multiple, une sélection ou une saisie.
Actif Indicateur pour identifier si la question est active.
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 sondage avec les contraintes appropriées est illustré ci-dessous.

CREATE TABLE `poll`.`poll_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`type` VARCHAR(50) 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_question_poll` (`pollId` ASC),
CONSTRAINT `fk_question_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Tableau des réponses aux sondages

Le tableau des réponses au sondage peut être utilisé pour stocker les réponses des questions à choix unique, à choix multiples et de type sélection. En cas de 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 sondage.

Identifiant L'identifiant unique pour identifier la réponse au sondage.
Identifiant du sondage L'identifiant du sondage pour identifier le sondage/sondage 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.
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 des réponses au sondage avec les contraintes appropriées est illustré ci-dessous.

CREATE TABLE `poll`.`poll_answer` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` 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_poll` (`pollId` ASC),
CONSTRAINT `fk_answer_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `poll`.`poll_answer`
ADD INDEX `idx_answer_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_answer`
ADD CONSTRAINT `fk_answer_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Tableau des votes par sondage

Le tableau des votes par sondage peut être utilisé pour stocker les choix et les entrées de l'utilisateur. Vous trouverez ci-dessous la description de toutes les colonnes du tableau des votes par scrutin.

Identifiant L'identifiant unique pour identifier le vote du sondage.
Identifiant du sondage L'identifiant du sondage pour identifier le sondage/l'enquête.
Identifiant de la question L'identifiant de la question pour identifier la question.
Identifiant de la réponse L'identifiant de réponse pour identifier la réponse.
Identifiant utilisateur L'identifiant d'utilisateur pour identifier l'utilisateur.
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 l'entrée de l'utilisateur.

Le tableau des votes par sondage avec les contraintes appropriées est illustré ci-dessous.

CREATE TABLE `poll`.`poll_vote` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`pollId` BIGINT NOT NULL,
`questionId` BIGINT NOT NULL,
`answerId` BIGINT DEFAULT NULL,
`userId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_vote_poll` (`pollId` ASC),
CONSTRAINT `fk_vote_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_question` (`questionId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_question`
FOREIGN KEY (`questionId`)
REFERENCES `poll`.`poll_question` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_answer` (`answerId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_answer`
FOREIGN KEY (`answerId`)
REFERENCES `poll`.`poll_answer` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

ALTER TABLE `poll`.`poll_vote`
ADD INDEX `idx_vote_user` (`userId` ASC);
ALTER TABLE `poll`.`poll_vote`
ADD CONSTRAINT `fk_vote_user`
FOREIGN KEY (`userId`)
REFERENCES `poll`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Tableau des catégories et tableau des catégories de sondage

Dans cette section, nous allons concevoir le tableau des catégories et tableau des catégories de sondage pour stocker les catégories de sondage et leurs mappages. Vous trouverez ci-dessous la description de toutes les colonnes du tableau des catégories.

Identifiant L'identifiant unique pour identifier la catégorie.
Identifiant parent L'identifiant parent pour identifier la catégorie parent.
Titre Le titre de la catégorie.
Méta-titre Le méta-titre à utiliser pour le titre du navigateur et le référencement.
limace Le slug de catégorie pour former l'URL.
Contenu La colonne utilisée pour stocker les données de catégorie.

Le tableau des catégories avec les contraintes appropriées est illustré ci-dessous.

CREATE TABLE `poll`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));

ALTER TABLE `poll`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `poll`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Vous trouverez ci-dessous la description de toutes les colonnes du tableau des catégories de sondage.

Identifiant du sondage L'identifiant du sondage pour identifier le sondage ou l'enquête.
Identifiant de catégorie L'identifiant de catégorie pour identifier la catégorie.

Le tableau des catégories de sondage avec les contraintes appropriées est illustré ci-dessous.

CREATE TABLE `poll`.`poll_category` (
`pollId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`pollId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_poll` (`pollId` ASC),
CONSTRAINT `fk_pc_poll`
FOREIGN KEY (`pollId`)
REFERENCES `poll`.`poll` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `poll`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Tableau des tags et tableau des tags de sondage

Semblable aux tableaux de catégories et de catégories de sondage, nous pouvons concevoir le tableau de balises et Tableau des balises de sondage . Les principales différences entre la catégorie et le tag sont répertoriées ci-dessous.

  • La colonne parentId n'est pas obligatoire dans le tableau des balises.
  • Le nombre de catégories reste faible car celles-ci peuvent être utilisées pour former le menu principal à des fins de navigation. Les tags peuvent être plus nombreux que les catégories.
  • Les catégories et les balises peuvent être utilisées pour relier les sondages.
  • Il ne faut attribuer que quelques catégories à un sondage alors que le nombre de balises peut être supérieur.

Résumé

C'est ainsi que nous pouvons concevoir une base de données de sondages à utiliser comme formation de sites Web et d'applications mobiles basés sur des sondages et des enquêtes. La même chose peut être encore améliorée pour ajouter des options plus avancées, y compris des vidéos, des paiements, des abonnements, etc.

Vous pouvez soumettre vos commentaires pour participer à la discussion. Vous pouvez également être intéressé par la conception de la base de données des applications Blog. La conception RBAC peut être utilisée pour la mise en œuvre du contrôle d'accès basé sur les rôles.

Le schéma complet de la base de données est également disponible sur GitHub.