Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Guia para projetar banco de dados para boletim informativo no MySQL


Este tutorial fornece as etapas completas para projetar um esquema de banco de dados do Sistema de Newsletter para gerenciar os usuários, boletins, assinantes e listas de discussão. Ele pode ser aprimorado e usado para desenvolver uma plataforma de marketing baseada em e-mail para fornecer serviços de Newsletter. A mesma arquitetura ou esquema de banco de dados pode ser usado como referência para gerenciar boletins online ou para distribuir as cópias impressas dos boletins e revistas. Também pode ser usado por agências de marketing digital para gerenciar seus leads e campanhas de marketing.



O diagrama de relacionamento de entidade ou design de banco de dados visual é mostrado abaixo.



Design de banco de dados de boletim informativo



Observações :O banco de dados pode ser aprimorado ainda mais adicionando as tabelas de controle de acesso baseado em função (RBAC). A segurança pode ser tratada seguindo o banco de dados RBAC no MySql. Além disso, não inclui as tabelas necessárias para o faturamento do cliente. Você pode consultar o banco de dados de carrinhos de compras on-line no MySQL para obter as tabelas necessárias para gerenciar os pedidos.



Você também pode visitar os tutoriais populares, incluindo como instalar o MySQL 8 no Ubuntu 20.04 LTS, como instalar o MySQL 8 no Windows, como instalar o MySQL Workbench no Ubuntu, como instalar o MySQL 8 com o Workbench no Windows 10, banco de dados RBAC no MySql, Banco de dados de blog em MySQL, banco de dados de questionário em MySQL, banco de dados de pesquisa e pesquisa em MySQL, banco de dados de carrinho de compras on-line em MySQL e aprenda consultas básicas de SQL em MySQL.


Banco de dados de boletins




O primeiro passo é criar o Banco de Dados de Newsletter. Ele pode ser criado usando a consulta conforme mostrado abaixo.


CRIAR ESQUEMA `newsletter` CONJUNTO DE CARACTERES PADRÃO utf8mb4 COLLATE utf8mb4_unicode_ci;



Eu usei o conjunto de caracteres utf8mb4 para suportar uma ampla gama de caracteres.


Tabela de usuário




Nesta seção, projetaremos a Tabela do usuário para armazenar informações do usuário. A mesma tabela pode ser usada para gerenciar diferentes tipos de usuários, incluindo administradores e clientes. Também pode ser usado para se relacionar com os gerentes de newsletter. Os usuários podem acompanhar seus próprios boletins e listas de discussão. Abaixo está a descrição de todas as colunas da Tabela de Usuários.


ID O ID exclusivo para identificar o usuário.
Nome O primeiro nome do usuário.
Nome do meio O nome do meio do usuário.
Sobrenome O sobrenome do usuário.
Celular O número de celular do usuário. Ele pode ser usado para fins de login e registro.
E-mail O e-mail do usuário. Ele pode ser usado para fins de login e registro.
Hash de senha O hash de senha gerado pelo algoritmo apropriado. Devemos evitar armazenar senhas simples ou criptografadas.
Administrador O sinalizador para identificar se o usuário é um administrador. Não é necessário se as tabelas RBAC forem criadas seguindo o design do banco de dados RBAC.
Cliente O sinalizador para identificar se o usuário cadastrado pode gerenciar as newsletters e assinantes. Não é necessário se as tabelas RBAC forem criadas seguindo o design do banco de dados RBAC.
Registrado em Esta coluna pode ser usada para calcular a vida útil do usuário com o aplicativo.
Último login Pode ser usado para identificar o último login do usuário.
Introdução A breve introdução do usuário.
Perfil Detalhes do cliente.



A Tabela de Usuários com as restrições apropriadas é mostrada abaixo.


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`) ,
ÍNDICE ÚNICO `uq_mobile` (`mobile` ASC),
ÍNDICE ÚNICO `uq_email` (`email` ASC) );


Tabela do boletim informativo




Nesta seção, projetaremos a Tabela de boletim informativo para armazenar os dados do boletim informativo. Abaixo está a descrição de todas as colunas da Tabela de Newsletter.


ID O ID exclusivo para identificar o boletim informativo.
ID de usuário O ID do usuário para identificar o administrador ou cliente.
Título O título do boletim informativo para identificar o boletim informativo.
Descrição A descrição do boletim informativo.
Tipo O tipo para distinguir entre os diferentes tipos de boletim informativo.
Vários O sinalizador para marcar se o boletim informativo será enviado uma ou várias vezes.
Global O sinalizador para marcar se a Newsletter será enviada a todos os assinantes.
Estado Pode ser usado para identificar o status. O possível status do boletim informativo inclui Novo, Pronto, Publicado.
Criado em Armazena a data e hora em que a newsletter é criada.
Atualizado em Armazena a data e hora em que a newsletter é atualizada.
Publicado em Armazena a data e hora em que a newsletter é publicada.
Conteúdo A coluna usada para armazenar o conteúdo do boletim informativo se o sinalizador múltiplo estiver definido como falso.



Ele usa a coluna múltipla para identificar se o boletim informativo está planejado para ser enviado apenas uma vez ou várias vezes. O conteúdo da Newsletter pode ser armazenado na coluna de conteúdo caso esteja planejado enviar apenas uma vez. Caso o sinalizador múltiplo seja definido como verdadeiro, a tabela de edição deve ser utilizada para armazenar o conteúdo de cada edição. A Tabela de Newsletter com as restrições apropriadas é mostrada abaixo.


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`)
REFERÊNCIAS `newsletter`.`user` (`id`)
ON DELETE NO ACTION
NA ATUALIZAÇÃO SEM AÇÃO);


Meta do boletim informativo




A Meta Tabela da Newsletter pode ser usada para armazenar informações adicionais sobre as newsletters, incluindo o URL do banner da newsletter, etc. Abaixo está a descrição de todas as colunas da Meta Tabela da Newsletter.


ID O ID exclusivo para identificar a meta do boletim informativo.
ID do boletim informativo O ID do boletim informativo para identificar o boletim informativo principal.
Tipo O tipo para categorizar os metadados.
Chave A chave que identifica o meta.
Conteúdo A coluna usada para armazenar os metadados do boletim informativo.



A Tabela Meta do Boletim com as restrições apropriadas é mostrada abaixo.


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),
ÍNDICE ÚNICO `uq_pnewsletter_meta` (`newsletterId` ASC, `key` ASC),
CONSTRAINT `fk_meta_newsletter`
FOREIGN KEY (`newsletterId`)
REFERÊNCIAS `newsletter `.`newsletter` (`id`)
NA DELETE SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO)
ENGINE =InnoDB;


Tabela de edição




Nesta seção, projetaremos a Tabela de edição para armazenar as edições do boletim informativo necessárias para boletins com vários sinalizadores definidos como verdadeiro. Abaixo está a descrição de todas as colunas da Tabela de Edição.


ID O ID exclusivo para identificar a edição.
ID do boletim informativo O ID do boletim informativo para identificar o boletim informativo principal.
Título O título da edição.
Descrição A descrição da edição.
Estado Pode ser usado para identificar o status. O possível status da edição inclui Novo, Pronto, Publicado.
Criado em Ele armazena a data e hora em que a edição foi criada.
Atualizado em Ele armazena a data e hora em que a edição foi atualizada.
Publicado em Ele armazena a data e hora em que a edição foi publicada.
Conteúdo A coluna usada para armazenar o conteúdo da edição.



A Tabela de Edição com as restrições apropriadas é mostrada abaixo.


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`)
REFERÊNCIAS `newsletter`.`newsletter` (`id`)
NA EXCLUSÃO SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO);


Tabela de Assinantes




Nesta seção, projetaremos o Assinante Tabela para armazenar os detalhes do assinante. A tabela de assinantes pode ser usada para acionar diretamente boletins globais. Abaixo está a descrição de todas as colunas da Tabela de Assinantes.


ID O ID exclusivo para identificar o assinante.
ID do cliente O ID do cliente para identificar o cliente. É um campo opcional e obrigatório apenas se o aplicativo for projetado para gerenciar os clientes e seus boletins. Os clientes podem gerenciar seus próprios assinantes.
Nome O primeiro nome do assinante.
Nome do meio O nome do meio do assinante.
Sobrenome O sobrenome do assinante.
E-mail O e-mail do assinante.
Celular O número de celular do assinante.
Telefone O número de telefone do assinante.
Ativo O sinalizador para identificar se o assinante está ativo.
Criado em Armazena a data e hora em que o assinante está registrado.
Atualizado em Ele armazena a data e hora em que o assinante é atualizado.



A Tabela de Assinantes com as restrições apropriadas é mostrada abaixo.


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`
CHAVE ESTRANGEIRA (`customerId`)
REFERÊNCIAS `newsletter`.`user` (`id`)
NA DELETE SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO);

ALTER TABLE `newsletter`.`subscriber` ADD UNIQUE `uq_sub_cust_email`(`customerId`, `email`);


Tabela de endereços




Nesta seção, projetaremos a Tabela de endereços para armazenar o endereço do cliente e do assinante. O endereço pode ser utilizado para a entrega física da Newsletter. Abaixo está a descrição de todas as colunas da Tabela de Endereços.


ID O ID exclusivo para identificar o endereço.
ID de usuário O ID do usuário para identificar o usuário associado ao endereço.
ID do assinante O ID do assinante para identificar o assinante associado ao endereço.
Nome O primeiro nome usado para o endereço. Ele pode ser derivado do Usuário ou Assinante correspondente.
Nome do meio O nome do meio usado para o endereço. Ele pode ser derivado do Usuário ou Assinante correspondente.
Sobrenome O sobrenome usado para o endereço. Ele pode ser derivado do Usuário ou Assinante correspondente.
Celular O celular usado para o endereço. Ele pode ser derivado do Usuário ou Assinante correspondente.
E-mail O e-mail usado para o endereço. Ele pode ser derivado do Usuário ou Assinante correspondente.
Linha 1 A primeira linha para armazenar o endereço.
Linha 2 A segunda linha para armazenar o endereço.
Cidade A cidade do endereço.
Província A província do endereço.
País O país do endereço.
Código de área O código de área para identificar a área de entrega.
Criado em Ele armazena a data e hora em que o endereço foi criado.
Atualizado em Ele armazena a data e hora em que o endereço é atualizado.



A Tabela de Endereços com as restrições apropriadas é mostrada abaixo.


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,
`cidade` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`país` 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`)
REFERÊNCIAS `newsletter`.`user` (`id`)
NA EXCLUSÃO SEM AÇÃO
NA ATUALIZAÇÃO NO ACTION);

ALTER TABLE `newsletter`.`address`
ADD INDEX `idx_address_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`address`
ADICIONAR CONSTRAINT `fk_address_subscriber`
CHAVE ESTRANGEIRA (`subscriberId`)
REFERÊNCIAS `newsletter`.`subscriber` (`id`)
ON DELETE NO ACTION
ON ATUALIZAR SEM AÇÃO;


Tabela da lista de correspondência




Nesta seção, projetaremos a Tabela da lista de e-mails para armazenar as listas de discussão de newsletters específicas. A lista de discussão pode ser usada para acionar os boletins não globais. A tabela de assinantes pode ser usada para acionar boletins globais. Abaixo está a descrição de todas as colunas da Tabela de Listas de Discussão.


ID O ID exclusivo para identificar a assinatura do boletim informativo.
ID do boletim informativo O ID do boletim informativo para identificar o boletim informativo associado à assinatura do boletim informativo.
ID do assinante O ID do assinante para identificar o assinante associado à assinatura do boletim informativo.
Ativo O sinalizador para identificar se a assinatura do boletim informativo está ativa.
Criado em Ele armazena a data e hora em que a assinatura foi criada.
Atualizado em Ele armazena a data e hora em que a assinatura é atualizada.



A tabela da lista de discussão com as restrições apropriadas é mostrada abaixo.


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`),
ÍNDICE `idx_mlist_newsletter` (`newsletterId` ASC),
CONSTRAINT `fk_mlist_newsletter`
FOREIGN KEY (`newsletterId`)
REFERÊNCIAS `newsletter`.`newsletter` (`id`)
NA DELETE SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO);

ALTER TABLE `newsletter`.`mailing_list`
ADICIONAR ÍNDICE `idx_mlist_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`mailing_list`
ADICIONAR CONSTRAINT `fk_mlist_subscriber`
FOREIGN KEY (`subscriberId`)
REFERÊNCIAS `newsletter`.`subscriber` (`id`)
NA EXCLUSÃO SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO;


Tabela de acionamento do boletim informativo




Também precisamos de uma tabela para rastrear a entrega do boletim informativo. Esta seção fornece a tabela e as colunas necessárias para rastrear a entrega do boletim informativo ao assinante. Abaixo está a descrição de todas as colunas da Tabela de Acionadores da Newsletter.


ID O ID exclusivo para identificar o acionador do boletim informativo.
ID do boletim informativo O ID do boletim informativo para identificar o boletim informativo associado ao acionador.
ID da edição O ID da edição para identificar a edição do boletim informativo associada ao acionador.
ID do assinante O ID do assinante para identificar o assinante associado ao acionador.
Enviado O sinalizador para verificar se a newsletter foi enviada ao assinante.
Entregue O sinalizador para verificar se o boletim informativo foi entregue ao assinante.
Modo O modo de entrega do boletim informativo pode ser on-line ou off-line.
Criado em Ele armazena a data e hora em que o gatilho é criado.
Atualizado em Ele armazena a data e hora em que o gatilho é atualizado.
Enviado em Ele armazena a data e hora em que o gatilho foi processado.
Entregue em Armazena a data e hora em que o boletim informativo foi entregue.



A Tabela de Acionadores do Boletim Informativo com as restrições apropriadas é mostrada abaixo.


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`)
REFERÊNCIAS `newsletter`.`newsletter` (`id`)
NA DELETE SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO);

ALTER TABLE `newsletter`.` newsletter_trigger`
ADD INDEX `idx_trigger_edition` (`editionId` ASC);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD CONST RAINT `fk_trigger_edition`
FOREIGN KEY (`editionId`)
REFERÊNCIAS `newsletter`.`edition` (`id`)
NA EXCLUSÃO SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO;

ALTER TABLE `newsletter`.`newsletter_trigger`
ADD INDEX `idx_trigger_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD CONSTRAINT `fk_trigger_subscriber`
CHAVE ESTRANGEIRA (`subscriberId`)
REFERÊNCIAS `newsletter`.`subscriber` (`id`)
NA EXCLUSÃO SEM AÇÃO
NA ATUALIZAÇÃO SEM AÇÃO;

Resumo




Neste tutorial, discutimos o design do banco de dados de um Sistema de Newsletter para armazenar os usuários e gerenciar os boletins. Ele também forneceu o design do banco de dados para gerenciar os assinantes e listas de discussão.



Você pode enviar seus comentários para participar da discussão. Você também pode estar interessado em projetar o banco de dados dos aplicativos Blog e Poll &Survey. O esquema completo do banco de dados também está disponível no GitHub.