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

Guía para diseñar una base de datos para cuestionarios en MySQL

Este tutorial proporciona pasos completos para diseñar un esquema de base de datos de pruebas en línea y sistemas de cuestionarios para administrar los usuarios, cuestionarios, preguntas, respuestas y tomas. Se puede usar más para desarrollar pruebas en línea o sitios web o aplicaciones basados ​​en cuestionarios.

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 :Se restringe a solo usuarios registrados para realizar el cuestionario para evitar el spam. Los cuestionarios se consideran cortos en comparación con las pruebas.

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 cuestionarios

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

CREATE SCHEMA `quiz` 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 del usuario. La misma tabla se puede usar para relacionar los anfitriones del cuestionario para que los usuarios puedan administrar sus propios cuestionarios y realizar un seguimiento de las tomas. 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 organizar un cuestionario.
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 Anfitrión que se mostrará en la Página de Prueba o Cuestionario.
Perfil Los detalles del propietario que se mostrarán en la página de prueba o cuestionario.

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

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

Tabla de preguntas

En esta sección, diseñaremos la Tabla de preguntas para almacenar los datos del cuestionario. A continuación se menciona la descripción de todas las columnas de la Tabla de Pruebas.

Id La identificación única para identificar el cuestionario.
Id. de host La identificación del anfitrión para identificar al anfitrión del cuestionario.
Título El título del cuestionario que se mostrará en la página del cuestionario y 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 prueba y el cuestionario.
Puntuación La puntuación total de la prueba.
Publicado Se puede usar para identificar si la prueba/cuestionario está disponible públicamente.
Creado en Almacena la fecha y hora en que se crea la prueba/cuestionario.
Actualizado en Almacena la fecha y hora en que se actualiza la prueba/cuestionario.
Publicado en Almacena la fecha y hora en que se publica la prueba/cuestionario.
Empieza en Almacena la fecha y la hora en que comienza la prueba/cuestionario y se abre para tomas.
Termina en Almacena la fecha y la hora en que la prueba/cuestionario cierra para tomas.
Contenido La columna utilizada para almacenar los datos de la prueba/cuestionario.

La Tabla de Pruebas con las restricciones apropiadas es como se muestra a continuación.

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

Metaprueba

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

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

La metatabla del cuestionario con las restricciones apropiadas se muestra a continuación.

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;

Tabla de preguntas del cuestionario

La tabla de preguntas del cuestionario se puede utilizar para almacenar las preguntas relacionadas con las pruebas y cuestionarios. A continuación se menciona la descripción de todas las columnas de la tabla de preguntas del cuestionario.

Id La identificación única para identificar la pregunta del cuestionario.
Id del cuestionario La identificación del cuestionario para identificar el examen/cuestionario principal.
Tipo El tipo de pregunta. El tipo puede ser de opción única (Sí/No), opción múltiple o selección. También podemos tener tipo como entrada y área de texto en caso de que el resultado de la prueba necesite verificaciones manuales.
Activo Marca para identificar si la pregunta está activa. Un cuestionario puede tener varias preguntas, pero solo las preguntas selectivas permanecen activas a la vez.
Nivel El nivel de la pregunta para identificar si es fácil, medio o difícil.
Puntuación La puntuación de una pregunta individual. Debemos asegurarnos de que solo las preguntas selectivas estén activas a la vez y que la puntuación total de las preguntas activas sea igual a la puntuación del cuestionario antes de publicar el cuestionario.
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 del cuestionario con las restricciones adecuadas se muestra a continuación.

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;

Tabla de respuestas del cuestionario

La tabla de respuestas del cuestionario 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 del cuestionario.

Id La identificación única para identificar la respuesta del cuestionario.
Id del cuestionario La identificación del cuestionario para identificar el examen/cuestionario principal.
Id. de pregunta La identificación de la pregunta para identificar la pregunta principal.
Activo Marca para identificar si la respuesta está activa.
Correcto Marca para identificar si la respuesta es correcta.
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 del cuestionario con las restricciones adecuadas se muestra a continuación.

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;

Tomar Mesa

En esta sección, diseñaremos la Take Table para realizar un seguimiento de la inscripción y el tiempo de los intentos de los usuarios para las pruebas. A continuación se menciona la descripción de todas las columnas de Take Table.

Id La identificación única para identificar la toma.
ID de usuario La identificación de usuario para identificar al participante del cuestionario.
Id del cuestionario La identificación del cuestionario para identificar el cuestionario.
Estado El estado de la toma. Se puede registrar, iniciar, pausar, finalizar, declarar.
Puntuación La puntuación total obtenida por el usuario.
Creado en Almacena la fecha y hora en que se crea la toma.
Actualizado en Almacena la fecha y hora en que se actualiza la toma.
Comenzó en Almacena la fecha y hora de inicio de la toma.
Terminado en Almacena la fecha y hora en que finaliza la toma.
Contenido La columna utilizada para almacenar los comentarios de toma.

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

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;

Tomar tabla de respuestas

La tabla de respuestas de toma se puede utilizar para almacenar las respuestas seleccionadas por el usuario mientras realiza el cuestionario. En el caso de una pregunta de opción múltiple, puede haber múltiples respuestas. A continuación se menciona la descripción de todas las columnas de la Tabla de respuestas.

Id La identificación única para identificar la respuesta de la toma.
Id. de toma La identificación de la toma para identificar el intento de prueba.
Id. de respuesta El ID de respuesta para identificar la respuesta del cuestionario.
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 en caso de preguntas de tipo input o textarea.

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

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;

Resumen

En este tutorial, hemos discutido el diseño de la base de datos de un sistema de cuestionarios para almacenar los usuarios, cuestionarios, preguntas, respuestas e intentos de cuestionarios en forma de tomas.

Puede enviar sus comentarios para unirse a la discusión. También te puede interesar diseñar la base de datos de las aplicaciones Blog y Poll &Survey.

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