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

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

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.