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. |
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. |
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. |
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.