sql >> Base de Datos >  >> RDS >> Mysql

Guía para diseñar bases de datos para encuestas y sondeos en MySQL

Este tutorial proporciona pasos completos para diseñar un esquema de base de datos de encuestas y encuestas cerradas o abiertas a través de cuestionarios para administrar los usuarios, las encuestas, las preguntas, las respuestas y los votos. Se puede utilizar además para desarrollar un sitio web de sondeos y encuestas o una aplicación móvil.

El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.

higo 1

Notas :Para mantener el esquema de la base de datos simple y desarrollar un producto viable mínimo, no cubre las opciones más avanzadas como el control de versiones y la revisión de encuestas y sondeos. Se restringe a que solo los usuarios registrados participen en una encuesta o sondeo para evitar el envío de correo no deseado y que solo se envíen votos legítimos.

También puede visitar los populares tutoriales que incluyen Cómo instalar MySQL 8 en Ubuntu, Cómo instalar MySQL 8 en Windows, Base de datos RBAC en MySql, Base de datos de blogs en MySql, Aprenda consultas SQL básicas en MySQL.

Base de datos de encuestas

El primer paso es crear la base de datos de encuestas. Se puede crear usando la consulta como se muestra a continuación.

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

He usado el conjunto de caracteres utf8mb4 para admitir una amplia gama de caracteres.

Tabla de usuarios

En esta sección, diseñaremos la Tabla de usuarios para almacenar información de usuario del propietario de la encuesta/encuesta. La misma tabla se puede usar para relacionar a los propietarios de encuestas/encuestas para que los usuarios puedan administrar su propia encuesta o encuesta y realizar un seguimiento de las actividades de votación. A continuación se menciona la descripción de todas las columnas de la tabla de usuarios.

Id La identificación única para identificar al usuario.
Nombre El nombre del usuario.
Segundo Nombre El segundo nombre del usuario.
Apellido El apellido del usuario.
Móvil El número de móvil del usuario. Se puede utilizar con fines de inicio de sesión y registro.
Correo electrónico El correo electrónico del usuario. Se puede utilizar con fines de inicio de sesión y registro.
Hash de contraseña El hash de contraseña generado por el algoritmo apropiado. Debemos evitar almacenar contraseñas sin formato.
Anfitrión La marca para identificar si el usuario puede alojar una encuesta o una encuesta.
Registrado en Esta columna se puede utilizar para calcular la vida del usuario con la aplicación.
Último inicio de sesión Se puede utilizar para identificar el último inicio de sesión del usuario.
Introducción La breve introducción del Usuario que se mostrará en la Encuesta o Página de Encuesta.
Perfil Los detalles del propietario que se mostrarán en la encuesta o página de encuesta.

La tabla de usuarios con las restricciones adecuadas se muestra a continuación.

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

Tabla de encuestas

En esta sección, diseñaremos la Tabla de encuestas para almacenar los datos de la encuesta y la encuesta. A continuación se menciona la descripción de todas las columnas de la tabla de encuestas.

Id La identificación única para identificar la encuesta/encuesta.
Id. de host La identificación del host para identificar el host de la encuesta/encuesta.
Título El título de la encuesta/encuesta que se mostrará en la Página de encuesta/encuesta y en las listas.
Metatítulo El metatítulo que se usará para el título del navegador y SEO.
Babosa El slug para formar la URL.
Resumen El resumen para mencionar los aspectos más destacados.
Tipo El tipo para distinguir entre la encuesta y la encuesta.
Publicado Se puede usar para identificar si la encuesta/encuesta está disponible públicamente.
Creado en Almacena la fecha y hora en que se crea el sondeo/encuesta.
Actualizado en Almacena la fecha y hora en que se actualiza el sondeo/encuesta.
Publicado en Almacena la fecha y hora en que se publica el sondeo/encuesta.
Empieza en Almacena la fecha y la hora en que comienza la encuesta/encuesta y se abre para votar.
Termina en Almacena la fecha y hora en que la encuesta/encuesta cierra para votar.
Contenido La columna utilizada para almacenar los datos de la encuesta/encuesta.

La tabla de encuestas con las restricciones apropiadas se muestra a continuación.

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

Encuesta Meta

La metatabla de la encuesta se puede utilizar para almacenar información adicional de una encuesta o sondeo, incluida la URL del banner de la encuesta, etc. A continuación se menciona la descripción de todas las columnas de la metatabla de la encuesta.

Id La identificación única para identificar la meta de la encuesta.
Id. de encuesta La identificación de la encuesta para identificar la encuesta/encuesta principal.
Clave La clave que identifica el meta.
Contenido La columna utilizada para almacenar los metadatos de la encuesta.

La metatabla de la encuesta con las restricciones apropiadas se muestra a continuación.

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;

Tabla de preguntas de la encuesta

La tabla de preguntas de sondeo se puede utilizar para almacenar las preguntas relacionadas con sondeos y encuestas. El escenario ideal es tener una pregunta para encuestas y múltiples preguntas para encuestas. A continuación se menciona la descripción de todas las columnas de la tabla de preguntas de la encuesta.

Id La identificación única para identificar la pregunta de la encuesta.
Id. de encuesta La identificación de la encuesta para identificar la encuesta/encuesta principal.
Tipo El tipo de pregunta. El tipo puede ser una opción única (Sí/No), opción múltiple, selección o entrada.
Activo Marca para identificar si la pregunta está activa.
Creado en Almacena la fecha y hora en que se crea la pregunta.
Actualizado en Almacena la fecha y hora en que se actualiza la pregunta.
Contenido La columna utilizada para almacenar la pregunta.

La tabla de preguntas de la encuesta con las restricciones adecuadas se muestra a continuación.

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;

Tabla de respuestas de la encuesta

La tabla de respuestas de la encuesta se puede utilizar para almacenar las respuestas de preguntas de opción única, opción múltiple y tipo de selección. En el caso de una pregunta de opción única, las respuestas pueden ser Sí y No. A continuación se menciona la descripción de todas las columnas de la Tabla de respuestas de la encuesta.

Id La identificación única para identificar la respuesta de la encuesta.
Id. de encuesta La identificación de la encuesta para identificar la encuesta/encuesta principal.
Id. de pregunta La identificación de la pregunta para identificar la pregunta principal.
Activo Marca para identificar si la respuesta está activa.
Creado en Almacena la fecha y hora en que se crea la respuesta.
Actualizado en Almacena la fecha y hora en que se actualiza la respuesta.
Contenido La columna utilizada para almacenar la respuesta.

La tabla de respuestas de la encuesta con las restricciones adecuadas se muestra a continuación.

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;

Tabla de votación de la encuesta

La tabla de votación de la encuesta se puede utilizar para almacenar las opciones y entradas del usuario. A continuación se menciona la descripción de todas las columnas de la tabla de votación de la encuesta.

Id La identificación única para identificar el voto de la encuesta.
Id. de encuesta La identificación de la encuesta para identificar la encuesta/encuesta.
Id. de pregunta La identificación de la pregunta para identificar la pregunta.
Id. de respuesta El ID de respuesta para identificar la respuesta.
ID de usuario El ID de usuario para identificar al usuario.
Creado en Almacena la fecha y hora en que se crea la respuesta.
Actualizado en Almacena la fecha y hora en que se actualiza la respuesta.
Contenido La columna utilizada para almacenar la entrada del usuario.

La tabla de votación de la encuesta con las restricciones apropiadas se muestra a continuación.

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;

Tabla de categorías y tabla de categorías de encuestas

En esta sección, diseñaremos la Tabla de categorías y Tabla de categorías de encuestas para almacenar las categorías de encuestas y sus asignaciones. A continuación se menciona la descripción de todas las columnas de la tabla de categorías.

Id La identificación única para identificar la categoría.
Id principal La identificación principal para identificar la categoría principal.
Título El título de la categoría.
Metatítulo El metatítulo que se usará para el título del navegador y SEO.
Babosa El slug de categoría para formar la URL.
Contenido La columna utilizada para almacenar los datos de la categoría.

La tabla de categorías con las restricciones apropiadas se muestra a continuación.

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;

A continuación se menciona la descripción de todas las columnas de la tabla de categorías de encuestas.

Id. de encuesta La identificación de la encuesta para identificar la encuesta o sondeo.
ID de categoría El ID de categoría para identificar la categoría.

La tabla de categorías de encuestas con las restricciones adecuadas se muestra a continuación.

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

Tabla de etiquetas y tabla de etiquetas de encuesta

Similar a las tablas de categorías y categorías de encuestas, podemos diseñar la Tabla de etiquetas y Tabla de etiquetas de encuesta . Las principales diferencias entre la categoría y la etiqueta se enumeran a continuación.

  • La columna parentId no es obligatoria en la tabla de etiquetas.
  • El recuento de categorías sigue siendo bajo, ya que se pueden usar para formar el menú principal con fines de navegación. Las etiquetas pueden ser más en comparación con las categorías.
  • Tanto las categorías como las etiquetas se pueden usar para relacionar las encuestas.
  • Uno debe asignar solo unas pocas categorías a una encuesta, mientras que el recuento de etiquetas puede ser mayor.

Resumen

Así es como podemos diseñar una base de datos de encuestas para ser utilizada como la formación de sitios web y aplicaciones móviles basados ​​en encuestas y encuestas. Lo mismo se puede mejorar aún más para agregar opciones más avanzadas, incluidos videos, pagos, suscripciones, etc.

Puede enviar sus comentarios para unirse a la discusión. También te puede interesar diseñar la base de datos de las aplicaciones de Blog. El diseño RBAC se puede utilizar para la implementación del control de acceso basado en funciones.

El esquema completo de la base de datos también está disponible en GitHub.