Este tutorial proporciona los pasos completos para diseñar un esquema de base de datos del sistema de eventos y recordatorios del calendario para administrar los eventos del calendario de los usuarios y también almacenar los recordatorios. Se puede mejorar aún más y utilizar para administrar los eventos y recordatorios de otras entidades además del usuario del sistema.
El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.

Diseño de la base de datos de eventos y recordatorios del calendario
También puede visitar los tutoriales populares que incluyen Cómo instalar MySQL 8 en Ubuntu 20.04 LTS, Cómo instalar MySQL 8 en Windows, Cómo instalar MySQL Workbench en Ubuntu, Cómo instalar MySQL 8 con Workbench en Windows 10, Base de datos RBAC en MySql, Blog Database en MySql, Quiz Database en MySQL, Poll &Survey Database en MySQL, Online Shopping Cart Database en MySQL y Learn Basic SQL Queries In MySQL.
Base de datos de calendario
El primer paso es crear la base de datos del calendario. Se puede crear usando la consulta como se muestra a continuación.
CREATE SCHEMA `calendar` 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. Los usuarios pueden gestionar sus propios eventos y recordatorios. 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 simples o encriptadas. |
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. |
Perfil | Detalles del usuario. |
La tabla de usuarios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `calendar`.`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,
`username` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`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_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
Tabla de eventos
En esta sección, diseñaremos la Tabla de eventos para almacenar los eventos del usuario y los eventos desencadenados por la aplicación. A continuación se menciona la descripción de todas las columnas de la tabla de eventos.
Id | La identificación única para identificar el evento. |
ID de usuario | El ID de usuario para identificar al usuario correspondiente. |
Id. de la fuente | La identificación de la fuente para identificar la entidad correspondiente. |
Tipo de fuente | El tipo de fuente para distinguir la entidad correspondiente entre otras entidades. |
Título | El título del evento. |
Descripción | La descripción del evento para almacenar los aspectos más destacados del evento. |
Tipo | El tipo para distinguir entre los diferentes tipos de eventos. |
URL | La URL para redirigir al usuario a un enlace específico asociado con el evento. |
Activo | Marca para identificar si el evento está activo y elegible para mostrarse en el calendario. |
Sistema | Marca para identificar si el evento es generado por la aplicación. Los eventos de la aplicación siempre serán elegibles para mostrarse en el calendario. |
Recuento de recordatorios | El número máximo de recordatorios que se pueden activar para el evento. |
Intervalo de recordatorio | El intervalo de recordatorio. |
Unidad de recordatorio | La unidad de recordatorio para identificar el intervalo de recordatorio en minutos, horas o días. |
Creado en | Almacena la fecha y hora en que se crea el evento. |
Actualizado en | Almacena la fecha y hora en que se actualiza el evento. |
Programado en | Almacena la fecha y la hora en el Calendario. |
Activado en | Almacena la fecha y hora en que se disparó el evento. |
Contenido | La columna utilizada para almacenar el contenido del evento. |
Utiliza la columna Activo para identificar si el evento generado por el usuario se puede mostrar en el calendario. El Sistema bandera se puede utilizar para marcar los eventos generados por la aplicación. Los eventos generados por la aplicación siempre se pueden mostrar en el calendario. Las columnas ID de la fuente y Tipo de fuente se puede utilizar para identificar las otras tablas o entidades asociadas con el evento. La columna Desencadenado en almacena la fecha y la hora en que se activó el evento por última vez. La tabla de eventos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `calendar`.`event` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`sourceId` BIGINT,
`sourceType` VARCHAR(50) NULL DEFAULT NULL,
`title` VARCHAR(1024) NOT NULL,
`descritpion` VARCHAR(2048) NULL DEFAULT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`url` VARCHAR(1024) NULL DEFAULT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`system` TINYINT(1) NOT NULL DEFAULT 0,
`reminderCount` SMALLINT(6) NOT NULL DEFAULT 0,
`reminderInterval` SMALLINT(6) NOT NULL DEFAULT 0,
`reminderUnit` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`scheduledAt` DATETIME NULL DEFAULT NULL,
`triggeredAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_event_user` (`userId` ASC),
CONSTRAINT `fk_event_user`
FOREIGN KEY (`userId`)
REFERENCES `calendar`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabla de plantillas de eventos
En esta sección, diseñaremos la Tabla de plantillas de eventos utilizado para generar el contenido del evento. La aplicación puede utilizar además el sistema de plantilla apropiado para analizar la plantilla para generar el contenido del evento. A continuación se menciona la descripción de todas las columnas de la tabla de plantillas de eventos.
Id | La identificación única para identificar la plantilla de evento. |
Título | El título de la plantilla. |
Descripción | La descripción de la plantilla. |
Tipo | El tipo para clasificar las plantillas. |
Tipo de fuente | El tipo de fuente para clasificar las plantillas según el tipo de fuente. |
Creado en | Almacena la fecha y hora en que se creó la plantilla. |
Actualizado en | Almacena la fecha y hora en que se actualizó la plantilla. |
Contenido | La columna utilizada para almacenar el contenido de la plantilla. |
La tabla de plantillas de eventos con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `calendar`.`event_template` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`description` VARCHAR(2048) NULL DEFAULT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`sourceType` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`) );
Tabla de recordatorios
También necesitamos una tabla para almacenar los recordatorios activados por eventos activos o del sistema. Esta sección proporciona la tabla y las columnas necesarias para administrar los recordatorios. A continuación se menciona la descripción de todas las columnas de la Tabla de Recordatorios.
Id | La identificación única para identificar el recordatorio. |
Id. de evento | El ID del evento para identificar el evento asociado con el recordatorio. |
ID de usuario | El ID de usuario para identificar al usuario asociado con el recordatorio. |
Leer | La bandera para marcar el recordatorio como leído/no leído. |
Papelera | La bandera para marcar el recordatorio como papelera. |
Creado en | Almacena la fecha y hora en que se crea el recordatorio. |
Actualizado en | Almacena la fecha y hora en que se actualiza el recordatorio. |
Contenido | El mensaje de recordatorio. |
La tabla de recordatorios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `calendar`.`reminder` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`eventId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`read` TINYINT(1) NOT NULL DEFAULT 1,
`trash` TINYINT(1) NOT NULL DEFAULT 1,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_reminder_event` (`eventId` ASC),
CONSTRAINT `fk_reminder_event`
FOREIGN KEY (`eventId`)
REFERENCES `calendar`.`event` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `calendar`.`reminder`
ADD INDEX `idx_reminder_user` (`userId` ASC);
ALTER TABLE `calendar`.`reminder`
ADD CONSTRAINT `fk_reminder_user`
FOREIGN KEY (`userId`)
REFERENCES `calendar`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Mejoras
También podemos administrar eventos grupales utilizando el mismo esquema de base de datos. Se puede hacer agregando la bandera del grupo a la tabla de eventos y se requiere una nueva tabla para administrar los participantes del evento grupal.
Resumen
En este tutorial, hemos discutido el diseño de la base de datos de un sistema de calendario para almacenar eventos y recordatorios de usuarios. También proporcionó el diseño de la base de datos para administrar los eventos de usuario activados por los sistemas o la aplicación.
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.