Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Przewodnik po projektowaniu bazy danych dla biuletynu w MySQL

Ten samouczek zawiera wszystkie kroki, aby zaprojektować schemat bazy danych systemu biuletynów do zarządzania użytkownikami, biuletynami, subskrybentami i listami mailingowymi. Można go dalej ulepszać i wykorzystywać do rozwijania platformy marketingowej opartej na poczcie e-mail w celu świadczenia usług biuletynu. Ta sama architektura lub schemat bazy danych może służyć jako odniesienie do zarządzania biuletynami online lub do dystrybucji biuletynów i czasopism w wersji papierowej. Może być również używany przez agencje marketingu cyfrowego do zarządzania potencjalnymi klientami i kampaniami marketingowymi.

Diagram relacji encji lub wizualny projekt bazy danych pokazano poniżej.

Projekt bazy danych biuletynu

Notatki :Bazę danych można dodatkowo ulepszyć, dodając tabele kontroli dostępu opartej na rolach (RBAC). Z zabezpieczeniami można się uporać, korzystając z bazy danych RBAC w MySql. Nie zawiera również tabel wymaganych do rozliczeń klientów. Możesz odwołać się do bazy danych koszyka zakupów online w MySQL, aby uzyskać tabele wymagane do zarządzania zamówieniami.

Możesz również odwiedzić popularne samouczki, w tym Jak zainstalować MySQL 8 na Ubuntu 20.04 LTS, Jak zainstalować MySQL 8 w systemie Windows, Jak zainstalować MySQL Workbench na Ubuntu, Jak zainstalować MySQL 8 z Workbench na Windows 10, Baza danych RBAC w MySql, Baza danych blogów w MySql, Baza danych quizów w MySQL, Baza ankiet i ankiet w MySQL, Baza danych koszyka zakupów online w MySQL oraz Nauka podstawowych zapytań SQL w MySQL.

Baza biuletynów

Pierwszym krokiem jest stworzenie Bazy Biuletynów. Można go utworzyć za pomocą zapytania, jak pokazano poniżej.

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

Użyłem zestawu znaków utf8mb4 do obsługi szerokiej gamy znaków.

Tabela użytkowników

W tej sekcji zaprojektujemy Tabelę użytkowników do przechowywania informacji o użytkowniku. Ta sama tabela może służyć do zarządzania różnymi typami użytkowników, w tym administratorami i klientami. Może być również używany do odnoszenia się do menedżerów biuletynów. Użytkownicy mogą śledzić własne biuletyny i listy mailingowe. Poniżej znajduje się opis wszystkich kolumn tabeli użytkowników.

Identyfikator Unikalny identyfikator do identyfikacji użytkownika.
Imię Imię użytkownika.
Drugie imię Drugie imię użytkownika.
Nazwisko Nazwisko użytkownika.
Komórka Numer telefonu komórkowego użytkownika. Może być używany do celów logowania i rejestracji.
Poczta e-mail E-mail użytkownika. Może być używany do celów logowania i rejestracji.
Hash hasła Skrót hasła wygenerowany przez odpowiedni algorytm. Musimy unikać przechowywania zwykłych lub zaszyfrowanych haseł.
Administrator Flaga określająca, czy użytkownik jest administratorem. Nie jest to wymagane, jeśli tabele RBAC są tworzone zgodnie z projektem bazy danych RBAC.
Klient Flaga określająca, czy zarejestrowany użytkownik może zarządzać biuletynami i subskrybentami. Nie jest to wymagane, jeśli tabele RBAC są tworzone zgodnie z projektem bazy danych RBAC.
Zarejestrowano w Ta kolumna może być użyta do obliczenia życia użytkownika z aplikacją.
Ostatnie logowanie Może być używany do identyfikacji ostatniego logowania użytkownika.
Wprowadzenie Krótkie wprowadzenie Użytkownika.
Profil Dane klienta.

Tabela użytkownika z odpowiednimi ograniczeniami jest pokazana poniżej.

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

Tabela z biuletynami

W tej sekcji zaprojektujemy Tabelę biuletynów do przechowywania danych newslettera. Poniżej znajduje się opis wszystkich kolumn tabeli biuletynów.

Identyfikator Unikalny identyfikator do identyfikacji biuletynu.
Identyfikator użytkownika Identyfikator użytkownika do identyfikacji administratora lub klienta.
Tytuł Tytuł biuletynu identyfikujący biuletyn.
Opis Opis biuletynu.
Wpisz Typ do rozróżniania różnych typów biuletynów.
Wiele Flaga oznaczająca, czy Newsletter zostanie wysłany raz, czy wiele razy.
Globalne Flaga oznaczająca, czy Newsletter zostanie wysłany do wszystkich subskrybentów.
Stan Może być używany do identyfikacji statusu. Możliwy status biuletynu to Nowy, Gotowy, Opublikowany.
Utworzono w Przechowuje datę i godzinę utworzenia biuletynu.
Aktualizacja o Przechowuje datę i godzinę aktualizacji biuletynu.
Opublikowano w Przechowuje datę i godzinę publikacji biuletynu.
Treść Kolumna używana do przechowywania treści biuletynu, jeśli flaga wielu jest ustawiona na wartość false.

Wykorzystuje kolumnę wielokrotność do określenia, czy Newsletter ma zostać wysłany tylko raz, czy kilka razy. Treść Newslettera może być przechowywana w kolumnie treści w przypadku, gdy planowana jest jednorazowa wysyłka. Jeśli flaga wielu jest ustawiona na true, tabela edycji musi być używana do przechowywania zawartości każdego wydania. Tabela biuletynów z odpowiednimi ograniczeniami jest pokazana poniżej.

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 biuletynu

Metatabela biuletynu może być używana do przechowywania dodatkowych informacji o biuletynach, w tym adresu URL banera biuletynu itp. Poniżej znajduje się opis wszystkich kolumn w metatablicy biuletynu.

Identyfikator Unikalny identyfikator do identyfikacji meta biuletynu.
Identyfikator biuletynu Identyfikator biuletynu identyfikujący biuletyn nadrzędny.
Wpisz Typ do kategoryzacji metadanych.
Klucz Klucz identyfikujący meta.
Treść Kolumna używana do przechowywania metadanych biuletynu.

Metatabela biuletynu z odpowiednimi ograniczeniami jest pokazana poniżej.

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;

Tabela edycji

W tej sekcji zaprojektujemy Tabelę edycji do przechowywania wydań biuletynów wymaganych dla biuletynów z wieloma flagami ustawionymi na true. Poniżej znajduje się opis wszystkich kolumn Tabeli Edycji.

Identyfikator Unikalny identyfikator do identyfikacji wydania.
Identyfikator biuletynu Identyfikator biuletynu identyfikujący biuletyn nadrzędny.
Tytuł Tytuł wydania.
Opis Opis wydania.
Stan Może być używany do identyfikacji statusu. Możliwy status wydania to Nowe, Gotowe, Opublikowane.
Utworzono w Przechowuje datę i godzinę utworzenia wydania.
Aktualizacja o Przechowuje datę i godzinę aktualizacji wydania.
Opublikowano w Przechowuje datę i godzinę publikacji wydania.
Treść Kolumna używana do przechowywania treści wydania.

Tabela edycji z odpowiednimi ograniczeniami jest pokazana poniżej.

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

Tabela subskrybentów

W tej sekcji zaprojektujemy Subskrybenta Stół do przechowywania danych subskrybenta. Tabela subskrybentów może być używana do bezpośredniego wyzwalania globalnych biuletynów. Poniżej znajduje się opis wszystkich kolumn tabeli subskrybentów.

Identyfikator Unikalny identyfikator do identyfikacji subskrybenta.
Identyfikator klienta Identyfikator klienta do identyfikacji klienta. Jest to pole opcjonalne i wymagane tylko wtedy, gdy aplikacja jest przeznaczona do zarządzania klientami i ich biuletynami. Klienci mogą zarządzać swoimi własnymi subskrybentami.
Imię Imię subskrybenta.
Drugie imię Drugie imię subskrybenta.
Nazwisko Nazwisko subskrybenta.
Poczta e-mail E-mail subskrybenta.
Komórka Numer telefonu komórkowego abonenta.
Telefon Numer telefonu subskrybenta.
Aktywny Flaga identyfikująca, czy subskrybent jest aktywny.
Utworzono w Przechowuje datę i godzinę rejestracji subskrybenta.
Aktualizacja o Przechowuje datę i godzinę aktualizacji subskrybenta.

Tabela subskrybentów z odpowiednimi ograniczeniami jest pokazana poniżej.

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

Tabela adresowa

W tej sekcji zaprojektujemy Tabelę adresów do przechowywania adresu klienta i abonenta. Adres może być wykorzystany do fizycznego dostarczania Newslettera. Poniżej znajduje się opis wszystkich kolumn tabeli adresów.

Identyfikator Unikalny identyfikator do identyfikacji adresu.
Identyfikator użytkownika Identyfikator użytkownika do identyfikacji użytkownika powiązanego z adresem.
Identyfikator subskrybenta Identyfikator subskrybenta do identyfikacji subskrybenta powiązanego z adresem.
Imię Imię użyte w adresie. Może pochodzić od odpowiedniego użytkownika lub subskrybenta.
Drugie imię Drugie imię użyte w adresie. Może pochodzić od odpowiedniego użytkownika lub subskrybenta.
Nazwisko Nazwisko użyte w adresie. Może pochodzić od odpowiedniego użytkownika lub subskrybenta.
Komórka Komórka użyta w adresie. Może pochodzić od odpowiedniego użytkownika lub subskrybenta.
Poczta e-mail E-mail użyty jako adres. Może pochodzić od odpowiedniego użytkownika lub subskrybenta.
Wiersz 1 Pierwszy wiersz do przechowywania adresu.
Wiersz 2 Druga linia do przechowywania adresu.
Miasto Miasto adresu.
Prowincja Prowincja adresu.
Kraj Kraj adresu.
Numer kierunkowy Numer kierunkowy do identyfikacji obszaru dostawy.
Utworzono w Przechowuje datę i godzinę utworzenia adresu.
Aktualizacja o Przechowuje datę i godzinę aktualizacji adresu.

Tabela adresów z odpowiednimi ograniczeniami jest pokazana poniżej.

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;

Tabela listy mailingowej

W tej sekcji zaprojektujemy Tabelę listy adresowej do przechowywania list mailingowych określonych biuletynów. Lista mailingowa może być używana do uruchamiania biuletynów nieglobalnych. Tabela subskrybentów może być używana do wyzwalania globalnych biuletynów. Poniżej znajduje się opis wszystkich kolumn tabeli list mailingowych.

Identyfikator Unikalny identyfikator identyfikujący subskrypcję biuletynu.
Identyfikator biuletynu Identyfikator biuletynu identyfikujący biuletyn powiązany z subskrypcją biuletynu.
Identyfikator subskrybenta Identyfikator subskrybenta do identyfikacji subskrybenta powiązanego z subskrypcją biuletynu.
Aktywny Flaga identyfikująca, czy subskrypcja biuletynu jest aktywna.
Utworzono w Przechowuje datę i godzinę utworzenia subskrypcji.
Aktualizacja o Przechowuje datę i godzinę aktualizacji subskrypcji.

Tabela listy mailingowej z odpowiednimi ograniczeniami jest pokazana poniżej.

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;

Tabela wyzwalająca biuletyn

Potrzebujemy również tabeli do śledzenia dostarczania Newslettera. Ta sekcja zawiera tabelę i kolumny wymagane do śledzenia dostarczania newslettera do subskrybenta. Poniżej znajduje się opis wszystkich kolumn tabeli wyzwalaczy biuletynu.

Identyfikator Unikalny identyfikator do identyfikacji wyzwalacza biuletynu.
Identyfikator biuletynu Identyfikator biuletynu identyfikujący biuletyn powiązany z wyzwalaczem.
Identyfikator wydania Identyfikator wydania identyfikujący wydanie biuletynu powiązane z wyzwalaczem.
Identyfikator subskrybenta Identyfikator subskrybenta do identyfikacji subskrybenta powiązanego z wyzwalaczem.
Wysłane Flaga sprawdzająca, czy newsletter został wysłany do subskrybenta.
Dostarczono Flaga sprawdzająca, czy newsletter został dostarczony do subskrybenta.
Tryb Tryb dostarczania biuletynu może być online lub offline.
Utworzono w Przechowuje datę i godzinę utworzenia wyzwalacza.
Aktualizacja o Przechowuje datę i godzinę aktualizacji wyzwalacza.
Wysłane w Przechowuje datę i godzinę przetworzenia wyzwalacza.
Dostarczono w Przechowuje datę i godzinę dostarczenia biuletynu.

Tabela wyzwalaczy biuletynu z odpowiednimi ograniczeniami jest pokazana poniżej.

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;

Podsumowanie

W tym samouczku omówiliśmy projekt bazy danych systemu biuletynów do przechowywania użytkowników i zarządzania biuletynami. Zapewnił również projekt bazy danych do zarządzania subskrybentami i listami mailingowymi.

Możesz przesłać swoje uwagi, aby dołączyć do dyskusji. Możesz być również zainteresowany zaprojektowaniem bazy danych aplikacji Blog oraz Poll &Survey. Pełny schemat bazy danych jest również dostępny na GitHub.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić wiele wierszy w jednym zapytaniu SQL — pytanie do wywiadu tygodnia #069

  2. Korzystanie z Oracle JDeveloper z MySQL Database Service na Oracle Cloud Platform, część 3

  3. Dlaczego warunek IN miałby być wolniejszy niż =w sql?

  4. Funkcje agregujące MySQL bez klauzuli GROUP BY

  5. Jak zainicjować bazę danych MySQL ze schematem w kontenerze Docker?