sql >> Databáze >  >> RDS >> Mysql

Průvodce návrhem databáze pro newsletter v MySQL

Tento tutoriál poskytuje úplné kroky k návrhu schématu databáze systému Newsletter System pro správu uživatelů, informačních bulletinů, odběratelů a seznamů adresátů. Může být dále vylepšen a použit k vývoji marketingové platformy založené na e-mailu pro poskytování služeb Newsletteru. Stejnou databázovou architekturu nebo schéma lze použít jako referenci pro správu online zpravodajů nebo pro distribuci tištěných kopií zpravodajů a časopisů. Mohou jej také používat digitální marketingové agentury ke správě potenciálních zákazníků a marketingových kampaní.

Diagram vztahů entit nebo návrh vizuální databáze je uveden níže.

Návrh databáze newsletterů

Poznámky :Databázi lze dále vylepšit přidáním tabulek řízení přístupu založeného na rolích (RBAC). Zabezpečení může být řešeno sledováním databáze RBAC v MySql. Nezahrnuje také tabulky potřebné pro fakturaci zákazníkům. Chcete-li odvodit tabulky potřebné pro správu objednávek, můžete se podívat na databázi online nákupních košíků v MySQL.

Můžete také navštívit oblíbené výukové programy včetně Jak nainstalovat MySQL 8 na Ubuntu 20.04 LTS, Jak nainstalovat MySQL 8 na Windows, Jak nainstalovat MySQL Workbench na Ubuntu, Jak nainstalovat MySQL 8 s Workbenchem na Windows 10, Databáze RBAC v MySql, Databáze blogů v MySql, kvízová databáze v MySQL, databáze anket a průzkumů v MySQL, databáze nákupních košíků online v MySQL a naučte se základní SQL dotazy v MySQL.

Databáze zpravodajů

Úplně prvním krokem je vytvoření databáze Newsletterů. Lze jej vytvořit pomocí dotazu, jak je uvedeno níže.

VÝCHOZÍ SADA ZNAKŮ VYTVOŘTE SCHÉMA `newsletter` utf8mb4 COLLATE utf8mb4_unicode_ci;

Použil jsem znakovou sadu utf8mb4 pro podporu široké škály znaků.

Tabulka uživatelů

V této části navrhneme Tabulku uživatelů k ukládání uživatelských informací. Stejnou tabulku lze použít ke správě různých typů uživatelů včetně správců a zákazníků. Může být také použit ke spojení se správci newsletteru. Uživatelé mohou sledovat své vlastní zpravodaje a seznamy adresátů. Níže je uveden popis všech sloupců tabulky uživatelů.

ID Jedinečné ID k identifikaci uživatele.
Křestní jméno Křestní jméno uživatele.
Prostřední jméno Prostřední jméno uživatele.
Příjmení Příjmení uživatele.
Mobil Číslo mobilního telefonu uživatele. Lze jej použít pro účely přihlášení a registrace.
E-mail E-mailová adresa uživatele. Lze jej použít pro účely přihlášení a registrace.
Hašování hesla Hash hash hesla vygenerovaný příslušným algoritmem. Musíme se vyhnout ukládání jednoduchých nebo šifrovaných hesel.
Správce Příznak určující, zda je uživatel správcem. Není to vyžadováno, pokud jsou tabulky RBAC vytvořeny podle návrhu databáze RBAC.
Zákazník Příznak pro identifikaci, zda registrovaný uživatel může spravovat newslettery a odběratele. Není to vyžadováno, pokud jsou tabulky RBAC vytvořeny podle návrhu databáze RBAC.
Registrováno na Tento sloupec lze použít k výpočtu životnosti uživatele s aplikací.
Poslední přihlášení Lze jej použít k identifikaci posledního přihlášení uživatele.
Úvod Krátké představení uživatele.
Profil Podrobnosti zákazníka.

Tabulka uživatelů s příslušnými omezeními je uvedena níže.

CREATE TABLE `newsletter`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50 ) NULL DEFAULT NULL,
`příjmení` VARCHAR(50) NULL DEFAULT NULL,
`mobilní` VARCHAR(15) NULL,
`e-mail` 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,
PRIMÁRNÍ KLÍČ (`id`) ,
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC));

Tabulka bulletinů

V této sekci navrhneme Tabulku newsletterů k ukládání dat newsletteru. Níže je uveden popis všech sloupců tabulky Newsletter.

ID Jedinečné ID pro identifikaci zpravodaje.
ID uživatele ID uživatele k identifikaci správce nebo zákazníka.
Název Název zpravodaje pro identifikaci zpravodaje.
Popis Popis zpravodaje.
Typ Typ pro rozlišení mezi různými typy zpravodajů.
Více Příznak pro označení, zda bude Newsletter odeslán jednou nebo vícekrát.
Globální Příznak pro označení, zda bude Newsletter zasílán všem odběratelům.
Stav Lze jej použít k identifikaci stavu. Možný stav zpravodaje zahrnuje Nový, Připraveno, Publikováno.
Vytvořeno v Ukládá datum a čas, kdy je zpravodaj vytvořen.
Aktualizováno dne Ukládá datum a čas, kdy je zpravodaj aktualizován.
Zveřejněno v Ukládá datum a čas, kdy je zpravodaj publikován.
Obsah Sloupec používaný k uložení obsahu zpravodaje, pokud je vícenásobný příznak nastaven na hodnotu false.

Pomocí násobku sloupce identifikuje, zda se Newsletter plánuje odeslat pouze jednou nebo vícekrát. Obsah Newsletteru lze uložit do sloupce obsahu pro případ, že je plánováno odeslat pouze jednou. V případě, že je vícenásobný příznak nastaven na hodnotu true, musí být k uložení obsahu každého vydání použita tabulka vydání. Tabulka Newsletteru s příslušnými omezeními je uvedena níže.

CREATE TABLE `newsletter`.`newsletter` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`popis` VARCHAR(2048) NULL VÝCHOZÍ NULL,
`typ` SMALLINT(6) NOT NULL VÝCHOZÍ 0,
`multiple` TINYINT(1) NOT NULL VÝCHOZÍ 0,
`globální` 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 VÝCHOZÍ NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_newsletter_user` (`userId` ASC),
CONSTRAINT `fk_newsletter_user`
CIZÍ KLÍČ (`userId`)
ODKAZY `newsletter`.`user` (`id`)
PŘI DELETE ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE);

Meta bulletinu

Metatabulku newsletteru lze použít k uložení dalších informací o newsletterech, včetně URL banneru newsletteru atd. Níže je uveden popis všech sloupců metatabulky Newsletteru.

ID Jedinečné ID k identifikaci meta newsletteru.
ID zpravodaje ID zpravodaje k identifikaci nadřazeného zpravodaje.
Typ Typ kategorizace metadat.
Klíč Klíč identifikující meta.
Obsah Sloupec používaný k ukládání metadat newsletteru.

Metatabulka Newsletteru s příslušnými omezeními je uvedena níže.

CREATE TABLE `newsletter`.`newsletter_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`newsletterId` BIGINT NOT NULL,
`type` VARCHAR(50) NOT NULL,
`klíč` VARCHAR(160) NOT NULL,
`obsah` TEXT NULL VÝCHOZÍ NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_meta_newsletter` (`newsletterId` ASC),
UNIQUE INDEX `uq_pnewsletter_meta` (`newsletterId` ASC, `key` ASC),
CONSTRAINT `fk_meta_newsletter`
CIZÍ KLÍČ (`newsletterId`)
REFERENCE `newsletter `.`newsletter` (`id`)
PŘI DELETE ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE)
ENGINE =InnoDB;

Tabulka vydání

V této části navrhneme Tabulku vydání k ukládání vydání zpravodajů požadovaných pro zpravodaje s více příznakem nastaveným na hodnotu true. Níže je uveden popis všech sloupců tabulky vydání.

ID Jedinečné ID k identifikaci vydání.
ID zpravodaje ID zpravodaje k identifikaci nadřazeného zpravodaje.
Název Název edice.
Popis Popis vydání.
Stav Lze jej použít k identifikaci stavu. Možný stav edice zahrnuje Nové, Připraveno, Publikováno.
Vytvořeno v Ukládá datum a čas, kdy byla edice vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy byla edice aktualizována.
Zveřejněno v Ukládá datum a čas, kdy bylo vydání publikováno.
Obsah Sloupec používaný k uložení obsahu vydání.

Tabulka vydání s příslušnými omezeními je uvedena níže.

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,
`stav` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL VÝCHOZÍ NULL,
`publishedAt` DATETIME NULL VÝCHOZÍ NULL,
`obsah` TEXT NULL VÝCHOZÍ NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_edition_newsletter` (` newsletterId` ASC),
OMEZENÍ `fk_edition_newsletter`
CIZÍ KLÍČ (`newsletterId`)
ODKAZY `newsletter`.`newsletter` (`id`)
PŘI VYMAZÁNÍ ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE);

Tabulka odběratelů

V této sekci navrhneme Předplatitele Tabulka pro uložení údajů o předplatiteli. Tabulku odběratelů lze použít k přímému spouštění globálních zpravodajů. Níže je uveden popis všech sloupců tabulky předplatitelů.

ID Jedinečné ID k identifikaci předplatitele.
Číslo zákazníka ID zákazníka k identifikaci zákazníka. Je to volitelné pole a je povinné pouze v případě, že je aplikace navržena pro správu zákazníků a jejich newsletterů. Zákazníci mohou spravovat své vlastní odběratele.
Křestní jméno Křestní jméno předplatitele.
Prostřední jméno Prostřední jméno předplatitele.
Příjmení Příjmení předplatitele.
E-mail E-mail odběratele.
Mobil Číslo mobilního telefonu předplatitele.
Telefon Telefonní číslo předplatitele.
Aktivní Příznak pro identifikaci, zda je účastník aktivní.
Vytvořeno v Ukládá datum a čas, kdy je účastník zaregistrován.
Aktualizováno dne Ukládá datum a čas, kdy je odběratel aktualizován.

Tabulka odběratelů s příslušnými omezeními je uvedena níže.

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,
`e-mail` VARCHAR(100) NOT NULL,
`mobil ` VARCHAR(50) NULL VÝCHOZÍ NULL,
`telefon` VARCHAR(50) NULL VÝCHOZÍ NULL,
`aktivní` TINYINT(1) NOT NULL VÝCHOZÍ 1,
`vytvořenoAt` DATETIME NOT NULL ,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_subscriber_customer` (`customerId` ASC),
CONSTRAINT `fk_subscriber_customer`
CIZÍ KLÍČ (`customerId`)
ODKAZY `newsletter`.`user` (`id`)
PŘI DELETE ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE);

ALTER TABLE `newsletter`.`subscriber` PŘIDAT UNIKÁTNÍ `uq_sub_cust_email`(`customerId`, `email`);

Tabulka adres

V této části navrhneme Tabulku adres k uložení adresy zákazníka a předplatitele. Adresu lze použít pro fyzické doručení Newsletteru. Níže je uveden popis všech sloupců tabulky adres.

ID Jedinečné ID k identifikaci adresy.
ID uživatele ID uživatele k identifikaci uživatele spojeného s adresou.
ID odběratele ID odběratele k identifikaci odběratele spojeného s adresou.
Křestní jméno Křestní jméno použité pro adresu. Může být odvozen od odpovídajícího uživatele nebo předplatitele.
Prostřední jméno Prostřední jméno použité pro adresu. Může být odvozen od odpovídajícího uživatele nebo předplatitele.
Příjmení Příjmení použité pro adresu. Může být odvozen od odpovídajícího uživatele nebo předplatitele.
Mobil Mobil použitý pro adresu. Může být odvozen od odpovídajícího uživatele nebo předplatitele.
E-mail E-mail použitý pro adresu. Může být odvozen od odpovídajícího uživatele nebo předplatitele.
Řádek 1 První řádek pro uložení adresy.
Řádek 2 Druhý řádek pro uložení adresy.
Město Město adresy.
Provincie Provincie adresy.
Země Země adresy.
Kód oblasti Kód oblasti k identifikaci oblasti doručení.
Vytvořeno v Ukládá datum a čas, kdy byla adresa vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je adresa aktualizována.

Tabulka adres s příslušnými omezeními je uvedena níže.

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,
`mobil ` VARCHAR(15) NULL,
`e-mail` VARCHAR(50) NULL,
`řádek1` VARCHAR(50) NULL VÝCHOZÍ NULL,
`řádek2` VARCHAR(50) NULL VÝCHOZÍ NULL,
`město` VARCHAR(50) NULL VÝCHOZÍ NULL,
`provincie` VARCHAR(50) NULL VÝCHOZÍ NULL,
`země` VARCHAR(50) NULL VÝCHOZÍ NULL,
` areaCode` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_address_user` (`userId` ASC),
CONSTRAINT `fk_address_user`
CIZÍ KLÍČ (`userId`)
ODKAZY `newsletter`.`user` (`id`)
PŘI SMAZÁNÍ ŽÁDNÁ AKCE
PŘI AKTUALIZACI NO ACTION);

ALTER TABLE `newsletter`.`adresa`
PŘIDAT INDEX `idx_address_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`adresa`
PŘIDAT OMEZENÍ `fk_address_subscriber`
CIZÍ KLÍČ (`subscriberId`)
ODKAZY `newsletter`.`subscriber` (`id`)
ZAPNUTO VYMAZAT ŽÁDNÁ AKCE
ZAPNUTO AKTUALIZOVAT ŽÁDNÁ AKCE;

Tabulka seznamu adresátů

V této části navrhneme Tabulku seznamu adresátů k ukládání seznamů adresátů konkrétních newsletterů. Seznam adresátů lze použít ke spouštění neglobálních newsletterů. Tabulku odběratelů lze použít ke spouštění globálních zpravodajů. Níže je uveden popis všech sloupců tabulky konference.

ID Jedinečné ID k identifikaci odběru newsletteru.
ID zpravodaje ID zpravodaje k identifikaci zpravodaje spojeného s odběrem zpravodaje.
ID odběratele ID odběratele k identifikaci odběratele spojeného s odběrem zpravodaje.
Aktivní Příznak pro identifikaci, zda je aktivní přihlášení k odběru newsletteru.
Vytvořeno v Ukládá datum a čas vytvoření předplatného.
Aktualizováno dne Ukládá datum a čas, kdy je předplatné aktualizováno.

Tabulka seznamu adresátů s příslušnými omezeními je uvedena níže.

CREATE TABLE `newsletter`.`mailing_list` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`newsletterId` BIGINT NOT NULL,
`subscriberId` BIGINT NOT NULL,
`aktivní` TINYINT(1) NOT NULL DEFAULT 1,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_mlist_newsletter` (`newsletterId` ASC),
CONSTRAINT `fk_mlist_newsletter`
CIZÍ KLÍČ (`newsletterId`)
ODKAZY `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`
PŘIDAT OMEZENÍ `fk_mlist_subscriber`
CIZÍ KLÍČ (`subscriberId`)
ODKAZY `newsletter`.`subscriber` (`id`)
PŘI DELETE ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE;

Tabulka spouštění zpravodaje

Potřebujeme také tabulku pro sledování doručení newsletteru. Tato část obsahuje tabulku a sloupce potřebné ke sledování doručení newsletteru odběrateli. Níže je uveden popis všech sloupců tabulky spouštění zpravodaje.

ID Jedinečné ID k identifikaci spouštěče bulletinu.
ID zpravodaje ID zpravodaje k identifikaci zpravodaje spojeného se spouštěčem.
ID edice ID vydání k identifikaci vydání zpravodaje spojeného se spouštěčem.
ID odběratele ID odběratele k identifikaci odběratele spojeného se spouštěčem.
Odesláno Příznak pro kontrolu, zda byl newsletter odeslán odběrateli.
Doručeno Příznak pro kontrolu, zda byl newsletter doručen odběrateli.
Režim Režim doručování newsletteru může být buď online, nebo offline.
Vytvořeno v Ukládá datum a čas, kdy je spouštěč vytvořen.
Aktualizováno dne Ukládá datum a čas, kdy je spouštěč aktualizován.
Odesláno v Ukládá datum a čas, kdy byl spouštěč zpracován.
Doručeno v Ukládá datum a čas, kdy byl zpravodaj doručen.

Tabulka spouštění bulletinu s příslušnými omezeními je uvedena níže.

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,
`doručená` TINYINT(1) NOT NULL DEFAULT 1,
`režim` SMALLINT( 6) NOT NULL VÝCHOZÍ 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL VÝCHOZÍ NULL,
`sentAt` DATETIME NULL DEFAULT NULL,
`deliveredAt` DATETIME NULL DEFAULT NULL,
PRIMÁRNÍ KLÍČ (`id`),
INDEX `idx_trigger_newsletter` (`newsletterId` ASC),
CONSTRAINT `fk_trigger_newsletter`
CIZÍ KLÍČ (`newsletterId`)
ODKAZY `newsletter`.`newsletter` (`id`)
PŘI DELETE ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE);

ALTER TABLE `newsletter`.` newsletter_trigger`
PŘIDAT INDEX `idx_trigger_edition` (`editionId` ASC);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD CONST RAINT `fk_trigger_edition`
CIZÍ KLÍČ (`editionId`)
ODKAZY `newsletter`.`edition` (`id`)
PŘI DELETE ŽÁDNÁ AKCE
PŘI AKTUALIZACI ŽÁDNÁ AKCE;

ALTER TABLE `newsletter`.`newsletter_trigger`
PŘIDAT INDEX `idx_trigger_subscriber` (`subscriberId` ASC);
ALTER TABLE `newsletter`.`newsletter_trigger`
ADD OMEZENÍ `fk_trigger_subscriber`
CIZÍ KLÍČ (`subscriberId`)
REFERENCE `newsletter`.`subscriber` (`id`)
ON DELETE ŽÁDNÁ AKCE
ON AKTUALIZACE ŽÁDNÁ AKCE;

Shrnutí

V tomto tutoriálu jsme diskutovali o návrhu databáze systému zpravodajů pro ukládání uživatelů a správu informačních bulletinů. Poskytlo také návrh databáze pro správu odběratelů a e-mailových konferencí.

Do diskuse můžete zasílat své komentáře. Možná vás bude zajímat i návrh databáze aplikací Blog a Poll &Survey. Kompletní schéma databáze je k dispozici také na GitHubu.


  1. Jak se spouštějí paralelní plány – část 4

  2. Nasazení PostgreSQL na kontejneru Docker

  3. Proč SQL Server používá index scan místo index search, když klauzule WHERE obsahuje parametrizované hodnoty

  4. Kurz SQL:Jednorázové řešení, jak se naučit SQL