sql >> Database >  >> RDS >> Mysql

Gids voor het ontwerpen van database voor nieuwsbrief in MySQL

Deze tutorial biedt de volledige stappen voor het ontwerpen van een databaseschema van het nieuwsbriefsysteem om de gebruikers, nieuwsbrieven, abonnees en mailinglijsten te beheren. Het kan verder worden verbeterd en gebruikt om een ​​op e-mail gebaseerd marketingplatform te ontwikkelen om nieuwsbriefdiensten te leveren. Dezelfde database-architectuur of hetzelfde schema kan worden gebruikt als referentie om online nieuwsbrieven te beheren of om de papieren exemplaren van de nieuwsbrieven en tijdschriften te verspreiden. Het kan ook worden gebruikt door digitale marketingbureaus om hun leads en marketingcampagnes te beheren.

Het entiteitsrelatiediagram of visueel databaseontwerp wordt hieronder weergegeven.

Ontwerp nieuwsbriefdatabase

Opmerkingen :De database kan verder worden uitgebreid door de Role-Based Access Control (RBAC)-tabellen toe te voegen. De beveiliging kan worden afgehandeld door RBAC Database in MySql te volgen. Het bevat ook niet de tabellen die nodig zijn voor klantfacturering. U kunt de online winkelwagendatabase in MySQL raadplegen om de tabellen af ​​te leiden die nodig zijn om de bestellingen te beheren.

U kunt ook de populaire tutorials bezoeken, waaronder MySQL 8 installeren op Ubuntu 20.04 LTS, MySQL 8 installeren op Windows, MySQL Workbench installeren op Ubuntu, MySQL 8 installeren met Workbench op Windows 10, RBAC Database in MySql, Blogdatabase in MySql, quizdatabase in MySQL, enquête- en enquêtedatabase in MySQL, online winkelwagendatabase in MySQL en leer elementaire SQL-query's in MySQL.

Nieuwsbriefdatabase

De allereerste stap is het maken van de nieuwsbriefdatabase. Het kan worden gemaakt met behulp van de onderstaande query.

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

Ik heb de tekenset utf8mb4 . gebruikt om een ​​breed scala aan karakters te ondersteunen.

Gebruikerstabel

In deze sectie zullen we de Gebruikerstabel . ontwerpen om gebruikersinformatie op te slaan. Dezelfde tabel kan worden gebruikt om verschillende soorten gebruikers te beheren, waaronder beheerders en klanten. Het kan ook worden gebruikt om betrekking te hebben op de nieuwsbriefbeheerders. Gebruikers kunnen hun eigen nieuwsbrieven en mailinglijsten volgen. Hieronder staat de beschrijving van alle kolommen van de gebruikerstabel.

Id Het unieke ID om de gebruiker te identificeren.
Voornaam De voornaam van de gebruiker.
Middelste naam De middelste naam van de gebruiker.
Achternaam De achternaam van de gebruiker.
Mobiel Het mobiele nummer van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
E-mail Het e-mailadres van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
Wachtwoordhash De wachtwoord-hash gegenereerd door het juiste algoritme. We moeten vermijden om gewone of versleutelde wachtwoorden op te slaan.
Beheerder De vlag om aan te geven of de gebruiker een beheerder is. Het is niet vereist als RBAC-tabellen zijn gemaakt door het RBAC-databaseontwerp te volgen.
Klant De vlag om te identificeren of de geregistreerde gebruiker de nieuwsbrieven en abonnees kan beheren. Het is niet vereist als RBAC-tabellen zijn gemaakt door het RBAC-databaseontwerp te volgen.
Geregistreerd bij Deze kolom kan worden gebruikt om de levensduur van de gebruiker met de applicatie te berekenen.
Laatste aanmelding Het kan worden gebruikt om de laatste login van de gebruiker te identificeren.
Inleiding De korte introductie van de gebruiker.
Profiel Klantgegevens.

De gebruikerstabel met de juiste beperkingen wordt hieronder weergegeven.

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

Nieuwsbrieftabel

In deze sectie zullen we de Nieuwsbrieftabel . ontwerpen om de nieuwsbriefgegevens op te slaan. Hieronder staat de beschrijving van alle kolommen van de nieuwsbrieftabel.

Id De unieke id om de nieuwsbrief te identificeren.
Gebruikers-ID Het gebruikers-ID om de beheerder of klant te identificeren.
Titel De titel van de nieuwsbrief om de nieuwsbrief te identificeren.
Beschrijving De nieuwsbriefbeschrijving.
Type Het type om onderscheid te maken tussen de verschillende nieuwsbrieftypes.
Meerdere De vlag om aan te geven of de nieuwsbrief een of meerdere keren wordt verzonden.
Globaal De vlag om aan te geven of de nieuwsbrief naar alle abonnees wordt verzonden.
Status Het kan worden gebruikt om de status te identificeren. De mogelijke status van de nieuwsbrief omvat Nieuw, Klaar, Gepubliceerd.
Gemaakt op Het slaat de datum en tijd op waarop de nieuwsbrief is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de nieuwsbrief wordt bijgewerkt.
Gepubliceerd op Het slaat de datum en tijd op waarop de nieuwsbrief wordt gepubliceerd.
Inhoud De kolom die wordt gebruikt om de inhoud van de nieuwsbrief op te slaan als de meervoudige vlag is ingesteld op false.

Het gebruikt de kolom multiple om te bepalen of de nieuwsbrief slechts één keer of meerdere keren wordt verzonden. De inhoud van de nieuwsbrief kan worden opgeslagen in de inhoudskolom voor het geval het de bedoeling is dat deze slechts één keer wordt verzonden. Als de meervoudige vlag is ingesteld op waar, moet de editietabel worden gebruikt om de inhoud van elke editie op te slaan. De nieuwsbrieftabel met de juiste beperkingen is zoals hieronder weergegeven.

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

Nieuwsbrief Meta

De Nieuwsbrief Meta Tabel kan worden gebruikt om aanvullende informatie over nieuwsbrieven op te slaan, inclusief de nieuwsbrief banner URL etc. Hieronder staat de beschrijving van alle kolommen van de Nieuwsbrief Meta Tabel.

Id De unieke id om de nieuwsbrief-meta te identificeren.
Nieuwsbrief-ID De nieuwsbrief-ID om de oudernieuwsbrief te identificeren.
Type Het type om de metadata te categoriseren.
Sleutel De sleutel die de meta identificeert.
Inhoud De kolom die wordt gebruikt om de metadata van de nieuwsbrief op te slaan.

De nieuwsbrief-metatabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Uitgavetabel

In deze sectie zullen we de Edition Table . ontwerpen om de nieuwsbriefedities op te slaan die nodig zijn voor nieuwsbrieven met meerdere vlaggen ingesteld op waar. Hieronder staat de beschrijving van alle kolommen van de Editietabel.

Id Het unieke ID om de editie te identificeren.
Nieuwsbrief-ID De nieuwsbrief-ID om de oudernieuwsbrief te identificeren.
Titel De titel van de editie.
Beschrijving De editiebeschrijving.
Status Het kan worden gebruikt om de status te identificeren. De mogelijke status van de editie omvat Nieuw, Klaar, Gepubliceerd.
Gemaakt op Het slaat de datum en tijd op waarop de editie is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de editie is bijgewerkt.
Gepubliceerd op Het slaat de datum en tijd op waarop de editie werd gepubliceerd.
Inhoud De kolom die wordt gebruikt om de editie-inhoud op te slaan.

De editietabel met de juiste beperkingen is zoals hieronder weergegeven.

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

Abonneetabel

In deze sectie zullen we de Abonnee . ontwerpen Tabel om de abonneegegevens op te slaan. De abonneetabel kan worden gebruikt om direct wereldwijde nieuwsbrieven te activeren. Hieronder vindt u de beschrijving van alle kolommen van de abonneetabel.

Id De unieke id om de abonnee te identificeren.
Klant-ID De klant-ID om de klant te identificeren. Het is een optioneel veld en alleen vereist als de toepassing is ontworpen om de klanten en hun nieuwsbrieven te beheren. Klanten kunnen hun eigen abonnees beheren.
Voornaam De voornaam van de abonnee.
Middelste naam De middelste naam van de abonnee.
Achternaam De achternaam van de abonnee.
E-mail Het e-mailadres van de abonnee.
Mobiel Het mobiele nummer van de abonnee.
Telefoon Het telefoonnummer van de abonnee.
Actief De vlag om te identificeren of de abonnee actief is.
Gemaakt op Het slaat de datum en tijd op waarop de abonnee is geregistreerd.
Bijgewerkt om Het slaat de datum en tijd op waarop de abonnee wordt bijgewerkt.

De abonneetabel met de juiste beperkingen is zoals hieronder weergegeven.

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

Adrestabel

In deze sectie zullen we de Adrestabel . ontwerpen om het klant- en abonneeadres op te slaan. Het adres kan worden gebruikt voor de fysieke bezorging van de Nieuwsbrief. Hieronder staat de beschrijving van alle kolommen van de adrestabel.

Id De unieke id om het adres te identificeren.
Gebruikers-ID Het gebruikers-ID om de gebruiker te identificeren die aan het adres is gekoppeld.
Abonnee-ID De abonnee-ID om de abonnee te identificeren die aan het adres is gekoppeld.
Voornaam De voornaam die voor het adres wordt gebruikt. Het kan worden afgeleid van de corresponderende Gebruiker of Abonnee.
Middelste naam De middelste naam die voor het adres wordt gebruikt. Het kan worden afgeleid van de corresponderende Gebruiker of Abonnee.
Achternaam De achternaam die voor het adres wordt gebruikt. Het kan worden afgeleid van de corresponderende Gebruiker of Abonnee.
Mobiel De mobiele telefoon die voor het adres wordt gebruikt. Het kan worden afgeleid van de corresponderende Gebruiker of Abonnee.
E-mail Het e-mailadres dat voor het adres is gebruikt. Het kan worden afgeleid van de corresponderende Gebruiker of Abonnee.
Lijn 1 De eerste regel om het adres op te slaan.
Lijn 2 De tweede regel om het adres op te slaan.
Stad De plaats van het adres.
Provincie De provincie van het adres.
Land Het land van het adres.
Netnummer Het netnummer om het bezorggebied te identificeren.
Gemaakt op Het slaat de datum en tijd op waarop het adres is aangemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het adres is bijgewerkt.

De adrestabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Mailinglijsttabel

In deze sectie zullen we de Mailinglijsttabel . ontwerpen om de mailinglijsten van specifieke nieuwsbrieven op te slaan. De mailinglijst kan worden gebruikt om de niet-globale nieuwsbrieven te activeren. De abonneetabel kan worden gebruikt om wereldwijde nieuwsbrieven te activeren. Hieronder staat de beschrijving van alle kolommen van de mailinglijsttabel.

Id De unieke id om het abonnement op de nieuwsbrief te identificeren.
Nieuwsbrief-ID De nieuwsbrief-ID om de nieuwsbrief te identificeren die is gekoppeld aan het nieuwsbriefabonnement.
Abonnee-ID De abonnee-ID om de abonnee te identificeren die is gekoppeld aan het nieuwsbriefabonnement.
Actief De vlag om te identificeren of het nieuwsbriefabonnement actief is.
Gemaakt op Het slaat de datum en tijd op waarop het abonnement is aangemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop het abonnement is bijgewerkt.

De mailinglijsttabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Tabel met triggers voor nieuwsbrieven

We hebben ook een tabel nodig om de bezorging van de nieuwsbrief te volgen. Dit gedeelte bevat de tabel en kolommen die nodig zijn om de bezorging van de nieuwsbrief aan de abonnee te volgen. Hieronder vindt u de beschrijving van alle kolommen van de Nieuwsbrief-triggertabel.

Id Het unieke ID om de nieuwsbrieftrigger te identificeren.
Nieuwsbrief-ID De nieuwsbrief-ID om de nieuwsbrief te identificeren die aan de trigger is gekoppeld.
Editie-ID De editie-ID om de nieuwsbriefeditie te identificeren die aan de trigger is gekoppeld.
Abonnee-ID De abonnee-ID om de abonnee te identificeren die aan de trigger is gekoppeld.
Verzonden De vlag om te controleren of de nieuwsbrief naar de abonnee is verzonden.
Geleverd De vlag om te controleren of de nieuwsbrief bij de abonnee is afgeleverd.
Modus De leveringswijze van de nieuwsbrief kan online of offline zijn.
Gemaakt op Het slaat de datum en tijd op waarop de trigger is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de trigger is bijgewerkt.
Verzonden naar Het slaat de datum en tijd op waarop de trigger is verwerkt.
Geleverd bij Het slaat de datum en tijd op waarop de nieuwsbrief is afgeleverd.

De Nieuwsbrief-triggertabel met de juiste beperkingen is zoals hieronder weergegeven.

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;

Samenvatting

In deze tutorial hebben we het databaseontwerp van een nieuwsbriefsysteem besproken om de gebruikers op te slaan en de nieuwsbrieven te beheren. Het leverde ook het database-ontwerp om de abonnees en mailinglijsten te beheren.

U kunt uw opmerkingen indienen om deel te nemen aan de discussie. Mogelijk bent u ook geïnteresseerd in het ontwerpen van de database van de Blog- en Poll &Survey-applicaties. Het volledige databaseschema is ook beschikbaar op GitHub.


  1. Cloud Vendor Deep-Dive:PostgreSQL op AWS Aurora

  2. Is de volgorde van tabellen waarnaar wordt verwezen in de ON-clausule van de JOIN van belang?

  3. Wat is SQL Server Deadlock?

  4. sql ORDER DOOR meerdere waarden in een specifieke volgorde?