Mysql
 sql >> Database >  >> RDS >> Mysql

Guida alla progettazione di database per newsletter in MySQL

Questo tutorial fornisce i passaggi completi per progettare uno schema di database del sistema Newsletter per gestire utenti, newsletter, abbonati e mailing list. Può essere ulteriormente migliorato e utilizzato per sviluppare una piattaforma di marketing basata su e-mail per fornire servizi di Newsletter. La stessa architettura o schema di database può essere utilizzata come riferimento per la gestione delle newsletter online o per la distribuzione delle copie cartacee delle newsletter e delle riviste. Può essere utilizzato anche dalle agenzie di marketing digitale per gestire i propri contatti e le proprie campagne di marketing.

Il diagramma della relazione tra entità o il design del database visivo è mostrato di seguito.

Progettazione database newsletter

Note :il database può essere ulteriormente migliorato aggiungendo le tabelle di controllo degli accessi in base al ruolo (RBAC). La sicurezza può essere gestita seguendo il database RBAC in MySql. Inoltre, non include le tabelle richieste per la fatturazione del cliente. Puoi fare riferimento al database del carrello degli acquisti online in MySQL per ricavare le tabelle necessarie per gestire gli ordini.

Puoi anche visitare i tutorial popolari tra cui Come installare MySQL 8 su Ubuntu 20.04 LTS, Come installare MySQL 8 su Windows, Come installare MySQL Workbench su Ubuntu, Come installare MySQL 8 con Workbench su Windows 10, Database RBAC in MySql, Database del blog in MySql, database dei quiz in MySQL, database di sondaggi e sondaggi in MySQL, database del carrello degli acquisti online in MySQL e informazioni sulle query SQL di base in MySQL.

Banca dati newsletter

Il primo passo è creare il database della newsletter. Può essere creato utilizzando la query come mostrato di seguito.

CREATE SCHEMA `newsletter` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ho usato il set di caratteri utf8mb4 per supportare un'ampia gamma di caratteri.

Tabella utenti

In questa sezione, progetteremo la Tabella utente per memorizzare le informazioni sull'utente. La stessa tabella può essere utilizzata per gestire diversi tipi di utenti inclusi amministratori e clienti. Può anche essere utilizzato per relazionarsi con i gestori delle newsletter. Gli utenti possono tenere traccia delle proprie newsletter e mailing list. Di seguito è riportata la descrizione di tutte le colonne della Tabella Utente.

ID L'ID univoco per identificare l'utente.
Nome Il nome dell'utente.
Secondo nome Il secondo nome dell'utente.
Cognome Il cognome dell'utente.
Cellulare Il numero di cellulare dell'utente. Può essere utilizzato per scopi di accesso e registrazione.
E-mail L'e-mail dell'utente. Può essere utilizzato per scopi di accesso e registrazione.
Hash password L'hash della password generato dall'algoritmo appropriato. Dobbiamo evitare di memorizzare password semplici o crittografate.
Amministratore Il flag per identificare se l'utente è un amministratore. Non è necessario se le tabelle RBAC vengono create seguendo la progettazione del database RBAC.
Cliente Il flag per identificare se l'utente registrato può gestire le newsletter e gli iscritti. Non è necessario se le tabelle RBAC vengono create seguendo la progettazione del database RBAC.
Registrato presso Questa colonna può essere utilizzata per calcolare la vita dell'utente con l'applicazione.
Ultimo accesso Può essere utilizzato per identificare l'ultimo accesso dell'utente.
Introduzione La breve introduzione dell'Utente.
Profilo Dettagli cliente.

Di seguito è mostrata la tabella utente con i vincoli appropriati.

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) );

Tabella Newsletter

In questa sezione, progetteremo la Tabella delle newsletter per memorizzare i dati della newsletter. Di seguito è riportata la descrizione di tutte le colonne della Newsletter Table.

ID L'ID univoco per identificare la newsletter.
ID utente L'ID utente per identificare l'amministratore o il cliente.
Titolo Il titolo della newsletter per identificare la newsletter.
Descrizione La descrizione della newsletter.
Tipo Il tipo per distinguere tra i diversi tipi di newsletter.
Multiplo La bandiera per indicare se la Newsletter verrà inviata una o più volte.
Globale La bandiera per indicare se la Newsletter verrà inviata a tutti gli iscritti.
Stato Può essere utilizzato per identificare lo stato. Il possibile stato della newsletter include Nuovo, Pronto, Pubblicato.
Creato a Memorizza la data e l'ora di creazione della newsletter.
Aggiornato a Memorizza la data e l'ora di aggiornamento della newsletter.
Pubblicato su Memorizza la data e l'ora di pubblicazione della newsletter.
Contenuto La colonna utilizzata per memorizzare il contenuto della newsletter se il flag multiplo è impostato su false.

Utilizza il multiplo di colonna per identificare se la Newsletter è prevista per l'invio una sola volta o più volte. Il contenuto della Newsletter può essere memorizzato nella colonna del contenuto nel caso in cui sia previsto l'invio una sola volta. Nel caso in cui il flag multiplo sia impostato su true, la tabella dell'edizione deve essere utilizzata per memorizzare il contenuto di ciascuna edizione. La tabella della newsletter con i vincoli appropriati è quella mostrata di seguito.

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 newsletter

La Newsletter Meta Table può essere utilizzata per memorizzare informazioni aggiuntive sulle newsletter incluso l'URL del banner della newsletter, ecc. Di seguito è menzionata la descrizione di tutte le colonne della Newsletter Meta Table.

ID L'ID univoco per identificare il meta della newsletter.
ID newsletter L'ID newsletter per identificare la newsletter principale.
Tipo Il tipo per classificare i metadati.
Chiave La chiave che identifica il meta.
Contenuto La colonna utilizzata per memorizzare i metadati della newsletter.

La Newsletter Meta Table con i vincoli appropriati è quella mostrata di seguito.

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;

Tabella di edizione

In questa sezione, progetteremo la Edition Table per memorizzare le edizioni della newsletter richieste per le newsletter con flag multipli impostati su true. Di seguito è riportata la descrizione di tutte le colonne della Edition Table.

ID L'ID univoco per identificare l'edizione.
ID newsletter L'ID newsletter per identificare la newsletter principale.
Titolo Il titolo dell'edizione.
Descrizione La descrizione dell'edizione.
Stato Può essere utilizzato per identificare lo stato. Il possibile stato dell'edizione include Nuovo, Pronto, Pubblicato.
Creato a Memorizza la data e l'ora in cui è stata creata l'edizione.
Aggiornato a Memorizza la data e l'ora in cui l'edizione è stata aggiornata.
Pubblicato su Memorizza la data e l'ora in cui è stata pubblicata l'edizione.
Contenuto La colonna utilizzata per memorizzare il contenuto dell'edizione.

La tabella delle edizioni con i vincoli appropriati è quella mostrata di seguito.

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);

Tabella abbonati

In questa sezione, progetteremo il Abbonato Tabella per memorizzare i dettagli dell'abbonato. La tabella degli iscritti può essere utilizzata per attivare direttamente le newsletter globali. Di seguito è riportata la descrizione di tutte le colonne della Tabella Abbonati.

ID L'ID univoco per identificare l'abbonato.
ID cliente L'ID cliente per identificare il cliente. È un campo facoltativo e obbligatorio solo se l'applicazione è progettata per gestire i clienti e le loro newsletter. I clienti possono gestire i propri iscritti.
Nome Il nome dell'abbonato.
Secondo nome Il secondo nome dell'abbonato.
Cognome Il cognome dell'abbonato.
E-mail L'e-mail dell'abbonato.
Cellulare Il numero di cellulare dell'abbonato.
Telefono Il numero di telefono dell'abbonato.
Attivo Il flag per identificare se l'abbonato è attivo.
Creato a Memorizza la data e l'ora in cui l'abbonato è registrato.
Aggiornato a Memorizza la data e l'ora in cui l'abbonato viene aggiornato.

La tabella degli abbonati con i vincoli appropriati è quella mostrata di seguito.

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`);

Tabella degli indirizzi

In questa sezione, progetteremo la Tabella degli indirizzi per memorizzare l'indirizzo del cliente e dell'abbonato. L'indirizzo può essere utilizzato per la consegna fisica della Newsletter. Di seguito è riportata la descrizione di tutte le colonne della Tabella Indirizzi.

ID L'ID univoco per identificare l'indirizzo.
ID utente L'ID utente per identificare l'utente associato all'indirizzo.
ID abbonato L'ID abbonato per identificare l'abbonato associato all'indirizzo.
Nome Il nome utilizzato per l'indirizzo. Può essere derivato dall'Utente o dall'Abbonato corrispondente.
Secondo nome Il secondo nome utilizzato per l'indirizzo. Può essere derivato dall'Utente o dall'Abbonato corrispondente.
Cognome Il cognome utilizzato per l'indirizzo. Può essere derivato dall'Utente o dall'Abbonato corrispondente.
Cellulare Il cellulare utilizzato per l'indirizzo. Può essere derivato dall'Utente o dall'Abbonato corrispondente.
E-mail L'e-mail utilizzata per l'indirizzo. Può essere derivato dall'Utente o dall'Abbonato corrispondente.
Riga 1 La prima riga per memorizzare l'indirizzo.
Riga 2 La seconda riga per memorizzare l'indirizzo.
Città La città dell'indirizzo.
Provincia La provincia dell'indirizzo.
Paese Il paese dell'indirizzo.
Prefisso Il prefisso per identificare l'area di consegna.
Creato a Memorizza la data e l'ora in cui viene creato l'indirizzo.
Aggiornato a Memorizza la data e l'ora in cui l'indirizzo viene aggiornato.

La tabella degli indirizzi con i vincoli appropriati è quella mostrata di seguito.

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;

Tabella Mailing List

In questa sezione, progetteremo la Tabella Mailing List per memorizzare le mailing list di newsletter specifiche. La mailing list può essere utilizzata per attivare le newsletter non globali. La tabella degli iscritti può essere utilizzata per attivare newsletter globali. Di seguito è riportata la descrizione di tutte le colonne della Tabella della Mailing List.

ID L'ID univoco per identificare l'abbonamento alla newsletter.
ID newsletter L'ID newsletter per identificare la newsletter associata all'abbonamento alla newsletter.
ID abbonato L'ID abbonato per identificare l'abbonato associato all'abbonamento alla newsletter.
Attivo Il flag per identificare se l'iscrizione alla newsletter è attiva.
Creato a Memorizza la data e l'ora in cui viene creato l'abbonamento.
Aggiornato a Memorizza la data e l'ora in cui viene aggiornato l'abbonamento.

La tabella della mailing list con i vincoli appropriati è quella mostrata di seguito.

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;

Tabella di attivazione della newsletter

Abbiamo anche bisogno di una tabella per monitorare la consegna della Newsletter. Questa sezione fornisce la tabella e le colonne necessarie per tenere traccia dell'invio della newsletter all'abbonato. Di seguito è riportata la descrizione di tutte le colonne della Newsletter Trigger Table.

ID L'ID univoco per identificare l'attivatore della newsletter.
ID newsletter L'ID newsletter per identificare la newsletter associata al trigger.
ID edizione L'ID edizione per identificare l'edizione della newsletter associata al trigger.
ID abbonato L'ID abbonato per identificare l'abbonato associato al trigger.
Inviato Il flag per verificare se la newsletter è stata inviata all'iscritto.
Consegnato Il flag per verificare se la newsletter è stata consegnata all'iscritto.
Modalità La modalità di invio della newsletter può essere Online o Offline.
Creato a Memorizza la data e l'ora in cui viene creato il trigger.
Aggiornato a Memorizza la data e l'ora in cui il trigger viene aggiornato.
Inviato a Memorizza la data e l'ora in cui è stato elaborato il trigger.
Consegnato a Memorizza la data e l'ora in cui è stata consegnata la newsletter.

La tabella dei trigger della newsletter con i vincoli appropriati è quella mostrata di seguito.

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;

Riepilogo

In questo tutorial, abbiamo discusso la progettazione del database di un sistema di newsletter per archiviare gli utenti e gestire le newsletter. Ha inoltre fornito la progettazione del database per gestire gli abbonati e le mailing list.

Puoi inviare i tuoi commenti per partecipare alla discussione. Potresti anche essere interessato a progettare il database delle applicazioni Blog e Poll &Survey. Lo schema completo del database è disponibile anche su GitHub.