Este tutorial proporciona los pasos completos para diseñar un esquema de base de datos del sistema de boletines para administrar los usuarios, boletines, suscriptores y listas de correo. Se puede mejorar aún más y utilizar para desarrollar una plataforma de marketing basada en correo electrónico para proporcionar servicios de boletín informativo. La misma arquitectura o esquema de base de datos se puede utilizar como referencia para administrar boletines en línea o para distribuir las copias impresas de boletines y revistas. También puede ser utilizado por agencias de marketing digital para administrar sus clientes potenciales y campañas de marketing.
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 base de datos de boletines
Notas :La base de datos se puede mejorar aún más agregando tablas de control de acceso basado en roles (RBAC). La seguridad se puede manejar siguiendo la base de datos RBAC en MySql. Además, no incluye las tablas requeridas para la facturación al cliente. Puede consultar la base de datos del carrito de compras en línea en MySQL para derivar las tablas necesarias para administrar los pedidos.
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 boletines
El primer paso es crear la base de datos del boletín. Se puede crear usando la consulta como se muestra a continuación.
CREATE SCHEMA `newsletter` 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 administrar diferentes tipos de usuarios, incluidos administradores y clientes. También se puede utilizar para relacionarse con los gestores de newsletter. Los usuarios pueden realizar un seguimiento de sus propios boletines y listas de correo. 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. |
Administrador | La bandera para identificar si el usuario es un administrador. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC. |
Cliente | La bandera para identificar si el usuario registrado puede administrar los boletines y suscriptores. No es necesario si las tablas RBAC se crean siguiendo el diseño de la base de datos RBAC. |
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 | Datos del cliente. |
La tabla de usuarios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `newsletter`.`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,
`admin` TINYINT(1) NOT NULL DEFAULT 0,
`customer` 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 boletín
En esta sección diseñaremos la Tabla Newsletter para almacenar los datos del boletín. A continuación se menciona la descripción de todas las columnas de la Tabla del boletín.
Id | La identificación única para identificar el boletín. |
ID de usuario | La identificación de usuario para identificar al administrador o cliente. |
Título | El título del boletín para identificar el boletín. |
Descripción | La descripción del boletín. |
Tipo | El tipo para distinguir entre los diferentes tipos de newsletter. |
Múltiple | La bandera para marcar si el boletín se enviará una o varias veces. |
Global | La bandera para marcar si el Newsletter se enviará a todos los suscriptores. |
Estado | Se puede utilizar para identificar el estado. El posible estado del boletín incluye Nuevo, Listo, Publicado. |
Creado en | Almacena la fecha y hora en que se crea la newsletter. |
Actualizado en | Almacena la fecha y hora en que se actualiza la newsletter. |
Publicado en | Almacena la fecha y hora de publicación de la newsletter. |
Contenido | La columna utilizada para almacenar el contenido del boletín si el indicador múltiple se establece en falso. |
Utiliza la columna múltiple para identificar si el boletín está planificado para enviarse una sola vez o varias veces. El contenido del boletín se puede almacenar en la columna de contenido en caso de que se planee enviar solo una vez. En caso de que el indicador múltiple se establezca en verdadero, la tabla de edición debe usarse para almacenar el contenido de cada edición. La tabla del boletín con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `newsletter`.`newsletter` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`descritpion` VARCHAR(2048) NULL DEFAULT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`multiple` TINYINT(1) NOT NULL DEFAULT 0,
`global` TINYINT(1) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_newsletter_user` (`userId` ASC),
CONSTRAINT `fk_newsletter_user`
FOREIGN KEY (`userId`)
REFERENCES `newsletter`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Meta-boletín
La metatabla del boletín se puede utilizar para almacenar información adicional sobre los boletines, incluida la URL del banner del boletín, etc. A continuación se menciona la descripción de todas las columnas de la metatabla del boletín.
Id | La identificación única para identificar el meta del boletín. |
ID del boletín | La identificación del boletín para identificar el boletín principal. |
Tipo | El tipo para categorizar los metadatos. |
Clave | La clave que identifica el meta. |
Contenido | La columna utilizada para almacenar los metadatos del boletín. |
La metatabla del boletín con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `newsletter`.`newsletter_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`newsletterId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`key` VARCHAR(160) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_newsletter` (`newsletterId` ASC),
UNIQUE INDEX `uq_pnewsletter_meta` (`newsletterId` ASC, `key` ASC),
CONSTRAINT `fk_meta_newsletter`
FOREIGN KEY (`newsletterId`)
REFERENCES `newsletter`.`newsletter` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabla de ediciones
En esta sección diseñaremos la Tabla de Edición para almacenar las ediciones del boletín requeridas para boletines con bandera múltiple establecida en verdadero. A continuación se menciona la descripción de todas las columnas de la Tabla de Edición.
Id | La identificación única para identificar la edición. |
ID del boletín | La identificación del boletín para identificar el boletín principal. |
Título | El título de la edición. |
Descripción | La descripción de la edición. |
Estado | Se puede utilizar para identificar el estado. El posible estado de la edición incluye Nuevo, Listo, Publicado. |
Creado en | Almacena la fecha y hora en que se creó la edición. |
Actualizado en | Almacena la fecha y hora en que se actualizó la edición. |
Publicado en | Almacena la fecha y hora en que se publicó la edición. |
Contenido | La columna utilizada para almacenar el contenido de la edición. |
La tabla de edición con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `newsletter`.`edition` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`newsletterId` BIGINT NOT NULL,
`title` VARCHAR(100) NOT NULL,
`description` VARCHAR(2048) NULL DEFAULT NULL,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_edition_newsletter` (`newsletterId` ASC),
CONSTRAINT `fk_edition_newsletter`
FOREIGN KEY (`newsletterId`)
REFERENCES `newsletter`.`newsletter` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabla de suscriptores
En esta sección, diseñaremos el Suscriptor Mesa para almacenar los detalles del suscriptor. La tabla de suscriptores se puede utilizar para activar directamente boletines globales. A continuación se menciona la descripción de todas las columnas de la Tabla de suscriptores.
Id | La identificación única para identificar al suscriptor. |
Identificación del cliente | La identificación del cliente para identificar al cliente. Es un campo opcional y obligatorio solo si la aplicación está diseñada para administrar los clientes y sus boletines. Los clientes pueden administrar sus propios suscriptores. |
Nombre | El nombre del suscriptor. |
Segundo Nombre | El segundo nombre del suscriptor. |
Apellido | El apellido del suscriptor. |
Correo electrónico | El correo electrónico del suscriptor. |
Móvil | El número de móvil del suscriptor. |
Teléfono | El número de teléfono del suscriptor. |
Activo | La bandera para identificar si el suscriptor está activo. |
Creado en | Almacena la fecha y hora en que se registra el suscriptor. |
Actualizado en | Almacena la fecha y hora en que se actualiza el suscriptor. |
La tabla de suscriptores con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `newsletter`.`subscriber` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`customerId` BIGINT DEFAULT NULL,
`firstName` VARCHAR(100) NOT NULL,
`middleName` VARCHAR(100) NULL DEFAULT NULL,
`lastName` VARCHAR(100) NULL DEFAULT NULL,
`email` VARCHAR(100) NOT NULL,
`mobile` VARCHAR(50) NULL DEFAULT NULL,
`phone` VARCHAR(50) NULL DEFAULT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_subscriber_customer` (`customerId` ASC),
CONSTRAINT `fk_subscriber_customer`
FOREIGN KEY (`customerId`)
REFERENCES `newsletter`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `newsletter`.`subscriber` ADD UNIQUE `uq_sub_cust_email`(`customerId`, `email`);
Tabla de direcciones
En esta sección, diseñaremos la Tabla de direcciones para almacenar la dirección del cliente y del suscriptor. La dirección podrá ser utilizada para el envío físico de la Newsletter. A continuación se menciona la descripción de todas las columnas de la tabla de direcciones.
Id | La identificación única para identificar la dirección. |
ID de usuario | El ID de usuario para identificar al usuario asociado con la dirección. |
Id. de suscriptor | La identificación del suscriptor para identificar al suscriptor asociado con la dirección. |
Nombre | El primer nombre utilizado para la dirección. Puede derivarse del Usuario o Suscriptor correspondiente. |
Segundo Nombre | El segundo nombre utilizado para la dirección. Puede derivarse del Usuario o Suscriptor correspondiente. |
Apellido | El apellido utilizado para la dirección. Puede derivarse del Usuario o Suscriptor correspondiente. |
Móvil | El móvil utilizado para la dirección. Puede derivarse del Usuario o Suscriptor correspondiente. |
Correo electrónico | El correo electrónico utilizado para la dirección. Puede derivarse del Usuario o Suscriptor correspondiente. |
Línea 1 | La primera línea para almacenar la dirección. |
Línea 2 | La segunda línea para almacenar la dirección. |
Ciudad | La ciudad de la dirección. |
Provincia | La provincia de la dirección. |
País | El país de la dirección. |
Código de área | El código de área para identificar el área de entrega. |
Creado en | Almacena la fecha y hora en que se crea la dirección. |
Actualizado en | Almacena la fecha y hora en que se actualiza la dirección. |
La tabla de direcciones con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `newsletter`.`address` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`subscriberId` BIGINT NULL DEFAULT NULL,
`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,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`areaCode` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_address_user` (`userId` ASC),
CONSTRAINT `fk_address_user`
FOREIGN KEY (`userId`)
REFERENCES `newsletter`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `newsletter`.`address`
ADD INDEX `idx_address_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`address`
ADD CONSTRAINT `fk_address_subscriber`
FOREIGN KEY (`subscriberId`)
REFERENCES `newsletter`.`subscriber` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de lista de correo
En esta sección, diseñaremos la tabla de lista de correo para almacenar las listas de correo de boletines específicos. La lista de correo se puede utilizar para activar los boletines no globales. La tabla de suscriptores se puede utilizar para activar boletines globales. A continuación se menciona la descripción de todas las columnas de la tabla de lista de correo.
Id | La identificación única para identificar la suscripción al boletín. |
ID del boletín | La identificación del boletín para identificar el boletín asociado con la suscripción al boletín. |
Id. de suscriptor | La identificación del suscriptor para identificar al suscriptor asociado con la suscripción al boletín. |
Activo | La bandera para identificar si la suscripción al boletín está activa. |
Creado en | Almacena la fecha y hora en que se crea la suscripción. |
Actualizado en | Almacena la fecha y hora en que se actualiza la suscripción. |
La tabla de la lista de correo con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `newsletter`.`mailing_list` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`newsletterId` BIGINT NOT NULL,
`subscriberId` BIGINT NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_mlist_newsletter` (`newsletterId` ASC),
CONSTRAINT `fk_mlist_newsletter`
FOREIGN KEY (`newsletterId`)
REFERENCES `newsletter`.`newsletter` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `newsletter`.`mailing_list`
ADD INDEX `idx_mlist_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`mailing_list`
ADD CONSTRAINT `fk_mlist_subscriber`
FOREIGN KEY (`subscriberId`)
REFERENCES `newsletter`.`subscriber` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de activación del boletín
También necesitamos una tabla para realizar un seguimiento de la entrega del boletín. Esta sección proporciona la tabla y las columnas necesarias para realizar un seguimiento de la entrega del boletín al suscriptor. A continuación se menciona la descripción de todas las columnas de la tabla de activación del boletín.
Id | La identificación única para identificar el disparador del boletín. |
ID del boletín | La identificación del boletín para identificar el boletín asociado con el disparador. |
ID de edición | El ID de la edición para identificar la edición del boletín asociado con el disparador. |
Id. de suscriptor | La identificación del suscriptor para identificar al suscriptor asociado con el activador. |
Enviado | La bandera para verificar si el boletín ha sido enviado al suscriptor. |
Entregado | La bandera para comprobar si el boletín se ha entregado al suscriptor. |
Modo | El modo de entrega del boletín puede ser En línea o Fuera de línea. |
Creado en | Almacena la fecha y hora en que se crea el disparador. |
Actualizado en | Almacena la fecha y hora en que se actualiza el disparador. |
Enviado a | Almacena la fecha y hora en que se procesó el disparador. |
Entregado en | Almacena la fecha y hora en que se entregó el boletín. |
La tabla de activación del boletín con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `newsletter`.`newsletter_trigger` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`newsletterId` BIGINT NOT NULL,
`editionId` BIGINT NULL DEFAULT NULL,
`subscriberId` BIGINT NOT NULL,
`sent` TINYINT(1) NOT NULL DEFAULT 1,
`delivered` TINYINT(1) NOT NULL DEFAULT 1,
`mode` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`sentAt` DATETIME NULL DEFAULT NULL,
`deliveredAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_trigger_newsletter` (`newsletterId` ASC),
CONSTRAINT `fk_trigger_newsletter`
FOREIGN KEY (`newsletterId`)
REFERENCES `newsletter`.`newsletter` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD INDEX `idx_trigger_edition` (`editionId` ASC);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD CONSTRAINT `fk_trigger_edition`
FOREIGN KEY (`editionId`)
REFERENCES `newsletter`.`edition` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD INDEX `idx_trigger_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD CONSTRAINT `fk_trigger_subscriber`
FOREIGN KEY (`subscriberId`)
REFERENCES `newsletter`.`subscriber` (`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 boletines para almacenar los usuarios y administrar los boletines. También proporcionó el diseño de la base de datos para administrar los suscriptores y las listas de correo.
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.