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