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.