Denne vejledning indeholder de komplette trin til at designe et databaseskema for nyhedsbrevssystemet til at administrere brugere, nyhedsbreve, abonnenter og mailinglister. Det kan forbedres yderligere og bruges til at udvikle en e-mail-baseret marketingplatform til at levere nyhedsbrevstjenester. Den samme databasearkitektur eller skema kan bruges som reference til at administrere online nyhedsbreve eller til at distribuere papirkopier af nyhedsbreve og magasiner. Det kan også bruges af digitale marketingbureauer til at administrere deres kundeemner og marketingkampagner.
Entity Relationship Diagram eller visuelle databasedesign er vist nedenfor.
Nyhedsbrev Database Design
Noter :Databasen kan forbedres yderligere ved at tilføje RBAC-tabellerne (Role-Based Access Control). Sikkerheden kan håndteres ved at følge RBAC Database i MySql. Den inkluderer heller ikke de tabeller, der kræves til kundefakturering. Du kan henvise til Online Shopping Cart Database i MySQL for at udlede de tabeller, der er nødvendige for at administrere ordrerne.
Du kan også besøge de populære tutorials, herunder Sådan installeres MySQL 8 på Ubuntu 20.04 LTS, Sådan installeres MySQL 8 på Windows, Sådan installeres MySQL Workbench på Ubuntu, Sådan installeres MySQL 8 med Workbench på Windows 10, RBAC-database i MySql, Blogdatabase i MySQL, Quiz-database i MySQL, afstemnings- og undersøgelsesdatabase i MySQL, Online-indkøbskurvdatabase i MySQL og lær grundlæggende SQL-forespørgsler i MySQL.
Nyhedsbrevsdatabase
Det allerførste skridt er at oprette nyhedsbrevsdatabasen. Den kan oprettes ved hjælp af forespørgslen som vist nedenfor.
CREATE SCHEMA `newsletter` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Jeg har brugt tegnsættet utf8mb4 for at understøtte en bred vifte af tegn.
Brugertabel
I dette afsnit vil vi designe Brugertabellen at gemme brugeroplysninger. Den samme tabel kan bruges til at administrere forskellige typer brugere, herunder administratorer og kunder. Det kan også bruges til at forholde sig til nyhedsbrevscheferne. Brugere kan spore deres egne nyhedsbreve og mailinglister. Nedenfor nævnt er beskrivelsen af alle kolonnerne i brugertabellen.
Id | Det unikke id til at identificere brugeren. |
Fornavn | Brugerens fornavn. |
Mellemnavn | Brugerens mellemnavn. |
Efternavn | Brugerens efternavn. |
Mobil | Brugerens mobilnummer. Det kan bruges til login og registreringsformål. |
Brugerens e-mail. Det kan bruges til login og registreringsformål. | |
Password Hash | Adgangskodehashen genereret af den passende algoritme. Vi skal undgå at gemme almindelige eller krypterede adgangskoder. |
Admin | Flaget til at identificere, om brugeren er en administrator. Det er ikke påkrævet, hvis RBAC-tabeller oprettes ved at følge RBAC-databasedesignet. |
Kunde | Flaget til at identificere, om den registrerede bruger kan administrere nyhedsbreve og abonnenter. Det er ikke påkrævet, hvis RBAC-tabeller oprettes ved at følge RBAC-databasedesignet. |
Registreret på | Denne kolonne kan bruges til at beregne levetiden for brugeren med applikationen. |
Sidste login | Det kan bruges til at identificere brugerens sidste login. |
Introduktion | Den korte introduktion af brugeren. |
Profil | Kundeoplysninger. |
Brugertabellen med de relevante begrænsninger er vist nedenfor.
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) );
Nyhedsbrevstabel
I dette afsnit vil vi designe Nyhedsbrevstabellen at gemme nyhedsbrevsdata. Nedenfor nævnt er beskrivelsen af alle kolonnerne i nyhedsbrevstabellen.
Id | Det unikke id til at identificere nyhedsbrevet. |
Bruger-id | Bruger-id'et til at identificere administratoren eller kunden. |
Titel | Nyhedsbrevets titel til at identificere nyhedsbrevet. |
Beskrivelse | Nyhedsbrevets beskrivelse. |
Type | Typen til at skelne mellem de forskellige nyhedsbrevstyper. |
Flere | Flaget til at markere, om nyhedsbrevet skal sendes én eller flere gange. |
Global | Flaget for at markere, om nyhedsbrevet vil blive sendt til alle abonnenter. |
Status | Den kan bruges til at identificere status. Den mulige status for nyhedsbrevet inkluderer Ny, Klar, Udgivet. |
Oprettet på | Det gemmer datoen og klokkeslættet, hvor nyhedsbrevet oprettes. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor nyhedsbrevet opdateres. |
Udgivet på | Den gemmer datoen og tidspunktet, hvor nyhedsbrevet udgives. |
Indhold | Kolonnen, der bruges til at gemme nyhedsbrevets indhold, hvis multiple-flaget er sat til falsk. |
Den bruger kolonnemultiplen til at identificere, om nyhedsbrevet er planlagt kun at sende én eller flere gange. Nyhedsbrevets indhold kan gemmes i indholdskolonnen, hvis det er planlagt kun at sende én gang. I tilfælde af at flere flag er sat til sand, skal udgavetabellen bruges til at gemme indholdet af hver udgave. Nyhedsbrevstabellen med de relevante begrænsninger er som vist nedenfor.
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);
Nyhedsbrev Meta
Nyhedsbrevet Meta Table kan bruges til at gemme yderligere information om nyhedsbreve, herunder nyhedsbrevets banner URL osv. Nedenfor nævnt er beskrivelsen af alle kolonnerne i Nyhedsbrev Meta Table.
Id | Det unikke id til at identificere nyhedsbrevets meta. |
Nyhedsbrev-id | Nyhedsbrevs-id'et til at identificere det overordnede nyhedsbrev. |
Type | Typen til at kategorisere metadataene. |
Nøgle | Nøglen, der identificerer metaen. |
Indhold | Kolonnen, der bruges til at gemme nyhedsbrevets metadata. |
Nyhedsbrevets metatabel med de relevante begrænsninger er som vist nedenfor.
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;
Udgavetabel
I dette afsnit vil vi designe udgavetabellen for at gemme de nyhedsbrevsudgaver, der kræves til nyhedsbreve med flere flag sat til sand. Nedenfor nævnt er beskrivelsen af alle kolonnerne i udgavetabellen.
Id | Det unikke id til at identificere udgaven. |
Nyhedsbrev-id | Nyhedsbrevs-id'et til at identificere det overordnede nyhedsbrev. |
Titel | Udgavens titel. |
Beskrivelse | Udgavebeskrivelsen. |
Status | Den kan bruges til at identificere status. Den mulige status for udgaven inkluderer Ny, Klar, Udgivet. |
Oprettet på | Den gemmer datoen og tidspunktet, hvor udgaven blev oprettet. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor udgaven blev opdateret. |
Udgivet på | Den gemmer datoen og tidspunktet, hvor udgaven blev udgivet. |
Indhold | Kolonnen, der bruges til at gemme udgavens indhold. |
Udgavetabellen med de relevante begrænsninger er som vist nedenfor.
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);
Tabel med abonnenter
I dette afsnit vil vi designe Abonnenten Tabel for at gemme abonnentoplysningerne. Abonnenttabellen kan bruges til direkte at udløse globale nyhedsbreve. Nedenfor nævnt er beskrivelsen af alle kolonnerne i abonnenttabellen.
Id | Det unikke id til at identificere abonnenten. |
Kunde-id | Kunde-id'et til at identificere kunden. Det er et valgfrit felt og kun påkrævet, hvis applikationen er designet til at administrere kunderne og deres nyhedsbreve. Kunder kan administrere deres egne abonnenter. |
Fornavn | Abonnentens fornavn. |
Mellemnavn | Abonnentens mellemnavn. |
Efternavn | Abonnentens efternavn. |
Abonnentens e-mail. | |
Mobil | Abonnentens mobilnummer. |
Telefon | Telefonnummeret på abonnenten. |
Aktiv | Flaget til at identificere, om abonnenten er aktiv. |
Oprettet på | Det gemmer dato og klokkeslæt, hvor abonnenten er registreret. |
Opdateret kl. | Den gemmer datoen og tidspunktet, hvor abonnenten opdateres. |
Abonnenttabellen med de relevante begrænsninger er som vist nedenfor.
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`);
Adressetabel
I dette afsnit vil vi designe adressetabellen at gemme kunde- og abonnentadressen. Adressen kan bruges til den fysiske udlevering af Nyhedsbrevet. Nedenfor nævnt er beskrivelsen af alle kolonnerne i adressetabellen.
Id | Det unikke id til at identificere adressen. |
Bruger-id | Bruger-id'et til at identificere den bruger, der er knyttet til adressen. |
Abonnent-id | Abonnent-id'et til at identificere den abonnent, der er knyttet til adressen. |
Fornavn | Det fornavn, der bruges til adressen. Det kan afledes fra den tilsvarende bruger eller abonnent. |
Mellemnavn | Mellemnavnet brugt til adressen. Det kan afledes fra den tilsvarende bruger eller abonnent. |
Efternavn | Det efternavn, der bruges til adressen. Det kan afledes fra den tilsvarende bruger eller abonnent. |
Mobil | Mobilen brugt til adressen. Det kan afledes fra den tilsvarende bruger eller abonnent. |
E-mailen brugt til adressen. Det kan afledes fra den tilsvarende bruger eller abonnent. | |
Linje 1 | Den første linje til at gemme adresse. |
Linje 2 | Den anden linje til at gemme adresse. |
By | Byen for adressen. |
Provins | Provins for adressen. |
Land | Adressens land. |
Områdekode | Området til at identificere leveringsområdet. |
Oprettet på | Det gemmer datoen og klokkeslættet, hvor adressen er oprettet. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor adressen er opdateret. |
Adressetabellen med de relevante begrænsninger er som vist nedenfor.
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;
Tabel med postliste
I dette afsnit vil vi designe postlistetabellen at gemme mailinglisterne for specifikke nyhedsbreve. Mailinglisten kan bruges til at udløse de ikke-globale nyhedsbreve. Abonnenttabellen kan bruges til at udløse globale nyhedsbreve. Nedenfor nævnt er beskrivelsen af alle kolonnerne i postlistetabellen.
Id | Det unikke id til at identificere nyhedsbrevsabonnementet. |
Nyhedsbrev-id | Nyhedsbrevs-id'et til at identificere det nyhedsbrev, der er knyttet til nyhedsbrevsabonnementet. |
Abonnent-id | Abonnent-id'et til at identificere den abonnent, der er knyttet til nyhedsbrevsabonnementet. |
Aktiv | Flaget til at identificere, om nyhedsbrevsabonnementet er aktivt. |
Oprettet på | Det gemmer datoen og klokkeslættet, hvor abonnementet oprettes. |
Opdateret kl. | Det gemmer datoen og klokkeslættet, hvor abonnementet opdateres. |
Postlistetabellen med de relevante begrænsninger er som vist nedenfor.
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 med udløsning af nyhedsbrev
Vi har også brug for et bord til at spore levering af nyhedsbreve. Dette afsnit indeholder tabellen og kolonnerne, der kræves for at spore nyhedsbrevets levering til abonnenten. Nedenfor nævnt er beskrivelsen af alle kolonnerne i nyhedsbrevets triggertabell.
Id | Det unikke id til at identificere nyhedsbrevsudløseren. |
Nyhedsbrev-id | Nyhedsbrevs-id'et til at identificere nyhedsbrevet, der er knyttet til triggeren. |
Udgave-id | Udgave-id'et til at identificere den nyhedsbrevsudgave, der er knyttet til udløseren. |
Abonnent-id | Abonnent-id'et til at identificere den abonnent, der er knyttet til triggeren. |
Sendt | Flaget til at kontrollere, om nyhedsbrevet er sendt til abonnenten. |
Leveret | Flaget til at kontrollere, om nyhedsbrevet er blevet leveret til abonnenten. |
Tilstand | Måden for levering af nyhedsbreve kan enten være online eller offline. |
Oprettet på | Den gemmer datoen og klokkeslættet, hvor triggeren oprettes. |
Opdateret kl. | Den gemmer datoen og klokkeslættet, hvor triggeren opdateres. |
Sendt kl. | Den gemmer datoen og klokkeslættet, hvor triggeren blev behandlet. |
Leveret kl. | Den gemmer datoen og tidspunktet, hvor nyhedsbrevet blev leveret. |
Nyhedsbrevets triggertabell med de relevante begrænsninger er som vist nedenfor.
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;
Oversigt
I denne vejledning har vi diskuteret databasedesignet af et nyhedsbrevssystem til at gemme brugerne og administrere nyhedsbrevene. Det gav også databasedesignet til at administrere abonnenter og mailinglister.
Du kan indsende dine kommentarer for at deltage i diskussionen. Du kan også være interesseret i at designe databasen med Blog- og Poll &Survey-applikationerne. Det komplette databaseskema er også tilgængeligt på GitHub.