sql >> Databasteknik >  >> RDS >> Mysql

Guide till designdatabas för nyhetsbrev i MySQL

Den här handledningen innehåller de fullständiga stegen för att utforma ett databasschema för nyhetsbrevssystemet för att hantera användare, nyhetsbrev, prenumeranter och e-postlistor. Den kan förbättras ytterligare och användas för att utveckla en e-postbaserad marknadsföringsplattform för att tillhandahålla nyhetsbrevstjänster. Samma databasarkitektur eller schema kan användas som referens för att hantera nyhetsbrev online eller för att distribuera papperskopior av nyhetsbrev och tidskrifter. Den kan också användas av digitala marknadsföringsbyråer för att hantera sina potentiella kunder och marknadsföringskampanjer.

Entity Relationship Diagram eller visuell databasdesign visas nedan.

Nyhetsbrevsdatabasdesign

Anteckningar :Databasen kan förbättras ytterligare genom att lägga till RBAC-tabellerna (Role-Based Access Control). Säkerheten kan hanteras genom att följa RBAC Database i MySql. Det inkluderar inte heller de tabeller som krävs för kundfakturering. Du kan hänvisa till Online Shopping Cart Database i MySQL för att ta fram de tabeller som krävs för att hantera beställningarna.

Du kan också besöka de populära handledningarna inklusive Hur man installerar MySQL 8 på Ubuntu 20.04 LTS, Hur man installerar MySQL 8 på Windows, Hur man installerar MySQL Workbench på Ubuntu, Hur man installerar MySQL 8 med Workbench på Windows 10, RBAC Database i MySql, Bloggdatabas i MySQL, Frågesportsdatabas i MySQL, Enkät- och undersökningsdatabas i MySQL, Online Shopping Cart Database i MySQL och Lär dig grundläggande SQL-frågor i MySQL.

Nyhetsbrevsdatabas

Det allra första steget är att skapa nyhetsbrevsdatabasen. Den kan skapas med hjälp av frågan som visas nedan.

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

Jag har använt teckenuppsättningen utf8mb4 för att stödja ett stort antal tecken.

Användartabell

I det här avsnittet kommer vi att utforma användartabellen för att lagra användarinformation. Samma tabell kan användas för att hantera olika typer av användare inklusive administratörer och kunder. Den kan också användas för att relatera till nyhetsbrevsansvariga. Användare kan spåra sina egna nyhetsbrev och e-postlistor. Nedan nämns beskrivningen av alla kolumner i användartabellen.

Id Det unika ID:t för att identifiera användaren.
Förnamn Användarens förnamn.
Mellannamn Användarens mellannamn.
Efternamn Användarens efternamn.
Mobil Användarens mobilnummer. Den kan användas för inloggning och registreringsändamål.
E-post Användarens e-postadress. Den kan användas för inloggning och registreringsändamål.
Lösenordshash Lösenords-hash som genereras av lämplig algoritm. Vi måste undvika att lagra vanliga eller krypterade lösenord.
Admin Flaggan för att identifiera om användaren är en administratör. Det krävs inte om RBAC-tabeller skapas genom att följa RBAC-databasdesignen.
Kund Flaggan för att identifiera om den registrerade användaren kan hantera nyhetsbrev och prenumeranter. Det krävs inte om RBAC-tabeller skapas genom att följa RBAC-databasdesignen.
Registrerad på Denna kolumn kan användas för att beräkna användarens livslängd med programmet.
Senaste inloggning Den kan användas för att identifiera användarens senaste inloggning.
Intro Den korta introduktionen av användaren.
Profil Kundinformation.

Användartabellen med lämpliga begränsningar visas nedan.

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

Nyhetsbrevstabell

I det här avsnittet kommer vi att utforma nyhetsbrevstabellen för att lagra nyhetsbrevsdata. Nedan nämns beskrivningen av alla kolumner i nyhetsbrevstabellen.

Id Det unika ID:t för att identifiera nyhetsbrevet.
Användar-ID Användar-ID för att identifiera administratören eller kunden.
Titel Nyhetsbrevets titel för att identifiera nyhetsbrevet.
Beskrivning Nyhetsbrevets beskrivning.
Typ Typen för att skilja mellan de olika nyhetsbrevstyperna.
Flera Flaggan för att markera om nyhetsbrevet kommer att skickas en eller flera gånger.
Global Flaggan för att markera om nyhetsbrevet kommer att skickas till alla prenumeranter.
Status Den kan användas för att identifiera status. Den möjliga statusen för nyhetsbrevet inkluderar Ny, Klar, Publicerad.
Skapat vid Den lagrar datum och tid då nyhetsbrevet skapas.
Uppdaterad kl. Den lagrar datum och tid då nyhetsbrevet uppdateras.
Publicerad på Den lagrar datum och tid då nyhetsbrevet publiceras.
Innehåll Kolumnen som används för att lagra nyhetsbrevets innehåll om multipelflaggan är inställd på false.

Den använder kolumnmultipeln för att identifiera om nyhetsbrevet är planerat att skickas endast en eller flera gånger. Nyhetsbrevets innehåll kan lagras i innehållskolumnen om det bara är planerat att skickas en gång. Om multipelflaggan är satt till true, måste editionstabellen användas för att lagra innehållet i varje utgåva. Nyhetsbrevstabellen med lämpliga begränsningar visas nedan.

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

Nyhetsbrev Meta

Nyhetsbrevets metatabell kan användas för att lagra ytterligare information om nyhetsbrev inklusive webbadressen till nyhetsbrevets banner etc. Nedan nämns en beskrivning av alla kolumner i nyhetsbrevets metatabell.

Id Det unika ID:t för att identifiera nyhetsbrevets meta.
Nyhetsbrev-ID Nyhetsbrevets ID för att identifiera det överordnade nyhetsbrevet.
Typ Typen för att kategorisera metadata.
Nyckel Nyckeln som identifierar meta.
Innehåll Kolumnen som används för att lagra nyhetsbrevets metadata.

Nyhetsbrevets metatabell med lämpliga begränsningar är som visas nedan.

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;

Editionstabell

I det här avsnittet kommer vi att utforma Editionstabellen för att lagra de nyhetsbrevsutgåvor som krävs för nyhetsbrev med flera flaggor inställda på sant. Nedan nämns beskrivningen av alla kolumner i Edition-tabellen.

Id Det unika ID:t för att identifiera utgåvan.
Nyhetsbrev-ID Nyhetsbrevets ID för att identifiera det överordnade nyhetsbrevet.
Titel Uppgåvans titel.
Beskrivning Uppgåvans beskrivning.
Status Den kan användas för att identifiera status. Den möjliga statusen för utgåvan inkluderar Ny, Klar, Publicerad.
Skapat vid Den lagrar datum och tid då utgåvan skapades.
Uppdaterad kl. Den lagrar datum och tid då utgåvan uppdaterades.
Publicerad på Den lagrar datum och tid då utgåvan publicerades.
Innehåll Kolumnen som används för att lagra utgåvans innehåll.

Upplagatabellen med lämpliga begränsningar är som visas nedan.

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

Prenumeranttabell

I det här avsnittet kommer vi att utforma Prenumerant Tabell för att lagra abonnentuppgifterna. Prenumeranttabellen kan användas för att direkt trigga globala nyhetsbrev. Nedan nämns beskrivningen av alla kolumner i prenumeranttabellen.

Id Det unika ID:t för att identifiera abonnenten.
Kund-ID Kund-id för att identifiera kunden. Det är ett valfritt fält och krävs endast om applikationen är utformad för att hantera kunderna och deras nyhetsbrev. Kunder kan hantera sina egna prenumeranter.
Förnamn Prenumerantens förnamn.
Mellannamn Mellannamnet på abonnenten.
Efternamn Prenumerantens efternamn.
E-post E-postadressen till prenumeranten.
Mobil Abonnentens mobilnummer.
Telefon Telefonnumret till abonnenten.
Aktiv Flaggan för att identifiera om abonnenten är aktiv.
Skapat vid Den lagrar datum och tid då abonnenten är registrerad.
Uppdaterad kl. Den lagrar datum och tid då abonnenten uppdateras.

Prenumeranttabellen med lämpliga begränsningar är som visas nedan.

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

Adresstabell

I det här avsnittet kommer vi att utforma adresstabellen för att lagra kund- och abonnentadressen. Adressen kan användas för fysisk leverans av nyhetsbrevet. Nedan nämns beskrivningen av alla kolumner i adresstabellen.

Id Det unika ID:t för att identifiera adressen.
Användar-ID Användar-ID för att identifiera användaren som är kopplad till adressen.
Prenumerant-ID Prenumerant-id för att identifiera abonnenten som är kopplad till adressen.
Förnamn Förnamnet som används för adressen. Det kan härledas från motsvarande användare eller prenumerant.
Mellannamn Mellannamnet som används för adressen. Det kan härledas från motsvarande användare eller prenumerant.
Efternamn Det efternamn som används för adressen. Det kan härledas från motsvarande användare eller prenumerant.
Mobil Mobilen som används för adressen. Det kan härledas från motsvarande användare eller prenumerant.
E-post E-postadressen som används för adressen. Det kan härledas från motsvarande användare eller prenumerant.
rad 1 Första raden att lagra adress.
rad 2 Den andra raden för att lagra adressen.
Stad Stad för adressen.
Provins Adressens provins.
Land Adressens land.
riktnummer Riktnumret för att identifiera leveransområdet.
Skapat vid Den lagrar datum och tid då adressen skapas.
Uppdaterad kl. Den lagrar datum och tid då adressen uppdateras.

Adresstabellen med lämpliga begränsningar är som visas nedan.

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;

E-postlistatabell

I det här avsnittet kommer vi att utforma E-postlistatabellen för att lagra e-postlistor för specifika nyhetsbrev. E-postlistan kan användas för att trigga de icke-globala nyhetsbreven. Prenumeranttabellen kan användas för att utlösa globala nyhetsbrev. Nedan nämns beskrivningen av alla kolumner i e-postlistatabellen.

Id Det unika ID:t för att identifiera nyhetsbrevprenumerationen.
Nyhetsbrev-ID Nyhetsbrevets ID för att identifiera nyhetsbrevet som är kopplat till nyhetsbrevsprenumerationen.
Prenumerant-ID Prenumerant-id för att identifiera prenumeranten som är kopplad till nyhetsbrevprenumerationen.
Aktiv Flaggan för att identifiera om nyhetsbrevprenumerationen är aktiv.
Skapat vid Den lagrar datum och tid då prenumerationen skapades.
Uppdaterad kl. Den lagrar datum och tid då prenumerationen uppdateras.

Mailing List-tabellen med lämpliga begränsningar är som visas nedan.

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;

Tabell för utlösande av nyhetsbrev

Vi behöver också ett bord för att spåra leverans av nyhetsbrev. Det här avsnittet tillhandahåller tabellen och kolumnerna som krävs för att spåra nyhetsbrevets leverans till prenumeranten. Nedan nämns beskrivningen av alla kolumner i nyhetsbrevets triggertabell.

Id Det unika ID:t för att identifiera nyhetsbrevets utlösare.
Nyhetsbrev-ID Nyhetsbrevets ID för att identifiera nyhetsbrevet som är kopplat till utlösaren.
Utgåva-ID Utgåvans ID för att identifiera nyhetsbrevsutgåvan som är kopplad till utlösaren.
Prenumerant-ID Prenumerant-id för att identifiera abonnenten som är kopplad till utlösaren.
Skickat Flaggan för att kontrollera om nyhetsbrevet har skickats till prenumeranten.
Levereras Flaggan för att kontrollera om nyhetsbrevet har levererats till prenumeranten.
Läge Läget för leverans av nyhetsbrev kan vara antingen online eller offline.
Skapat vid Den lagrar datum och tid då utlösaren skapas.
Uppdaterad kl. Den lagrar datum och tid då triggern uppdateras.
Skickat till Den lagrar datum och tid då utlösaren bearbetades.
Levereras vid Den lagrar datum och tid då nyhetsbrevet levererades.

Nyhetsbrevets triggertabell med lämpliga begränsningar visas nedan.

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;

Sammanfattning

I den här handledningen har vi diskuterat databasdesignen av ett nyhetsbrevssystem för att lagra användarna och hantera nyhetsbreven. Det gav också databasdesignen för att hantera prenumeranter och e-postlistor.

Du kan skicka in dina kommentarer för att delta i diskussionen. Du kanske också är intresserad av att designa databasen med applikationerna Blog och Poll &Survey. Det fullständiga databasschemat finns också tillgängligt på GitHub.


  1. Hur man ställer in standardanvändarlösenordet i PostgreSQL

  2. Flera sätt att ta bort dubbletter från SQL-tabeller

  3. Utlöser utlösare vid uppdatering av kolumnA eller kolumnB eller kolumnC

  4. Fördelar med att använda SQL Ordinal Position Notation?