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