Ten samouczek zawiera kompletne kroki projektowania schematu bazy danych do zarządzania użytkownikami, postami w blogu, metadanymi postów, komentarzami postów, kategoriami postów i tagami postów. Może być dalej wykorzystywany do tworzenia witryny blogowej lub aplikacji mobilnej.
Diagram relacji encji lub wizualny projekt bazy danych pokazano poniżej.
Rys. 1
Notatki :Aby zachować prostotę schematu bazy danych i stworzyć minimalny opłacalny produkt, nie obejmuje bardziej zaawansowanych opcji, takich jak wersjonowanie i przeglądanie postów. Zapewnia opcje przeglądania komentarzy autorów postów, aby uniknąć spamowania, dzięki czemu tylko uzasadnione komentarze będą publikowane i wyświetlane na stronie posta.
Możesz także odwiedzić popularne samouczki, w tym Jak zainstalować MySQL 8 w Ubuntu, Jak zainstalować MySQL 8 w Windows, Baza danych RBAC w MySql, Baza danych ankiet i ankiet w MySql, Naucz się podstawowych zapytań SQL w MySQL.
Baza danych blogów
Pierwszym krokiem jest stworzenie bazy danych blogów. Można go utworzyć za pomocą zapytania, jak pokazano poniżej.
CREATE SCHEMA `blog` 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żytkownikach wszystkich autorów postów. Tej samej tabeli można użyć do powiązania autorów postów, aby wszyscy autorzy mogli zarządzać własnymi postami. 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 haseł. |
Zarejestrowano w | Ta kolumna może być użyta do obliczenia życia użytkownika z blogiem. |
Ostatnie logowanie | Może być używany do identyfikacji ostatniego logowania użytkownika. |
Wprowadzenie | Krótkie wprowadzenie Autora do wyświetlenia w każdym poście. |
Profil | Szczegóły autora, które mają być wyświetlane na stronie autora. |
Tabela użytkownika z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `blog`.`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,
`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) );
Opublikuj tabelę
W tej sekcji zaprojektujemy Tabelę postów do przechowywania danych pocztowych. Poniżej znajduje się opis wszystkich kolumn tabeli postów.
Identyfikator | Unikalny identyfikator do identyfikacji posta. |
Identyfikator autora | Identyfikator autora identyfikujący autora posta. |
Identyfikator rodzica | Identyfikator nadrzędny identyfikujący nadrzędny post. Może być użyty do utworzenia spisu treści nadrzędnego posta serii. |
Tytuł | Tytuł posta, który ma być wyświetlany na stronie posta i listach. |
Metatytuł | Metatytuł używany do tytułu przeglądarki i SEO. |
Ślimak | Uruchomienie posta do utworzenia adresu URL. |
Podsumowanie | Podsumowanie postu, aby wspomnieć o najważniejszych wydarzeniach. |
Opublikowane | Może być użyty do określenia, czy post jest publicznie dostępny. |
Utworzono w | Przechowuje datę i godzinę utworzenia wpisu. |
Aktualizacja o | Przechowuje datę i godzinę aktualizacji posta. |
Opublikowano w | Przechowuje datę i godzinę opublikowania posta. |
Treść | Kolumna używana do przechowywania danych postów. |
Tabela postów z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `blog`.`post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`authorId` BIGINT NOT NULL,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`published` TINYINT(1) 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`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_post_user` (`authorId` ASC),
CONSTRAINT `fk_post_user`
FOREIGN KEY (`authorId`)
REFERENCES `blog`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `blog`.`post`
ADD INDEX `idx_post_parent` (`parentId` ASC);
ALTER TABLE `blog`.`post`
ADD CONSTRAINT `fk_post_parent`
FOREIGN KEY (`parentId`)
REFERENCES `blog`.`post` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Opublikuj meta
Metatabela postu może być używana do przechowywania dodatkowych informacji o poście, w tym adresu URL banera posta itp. Poniżej znajduje się opis wszystkich kolumn metatabeli postu.
Identyfikator | Unikalny identyfikator do identyfikacji meta postu. |
Identyfikator posta | Identyfikator wpisu identyfikujący wpis nadrzędny. |
Klucz | Klucz identyfikujący meta. |
Treść | Kolumna używana do przechowywania danych postów. |
Metatabela postu z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `blog`.`post_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`postId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_post` (`postId` ASC),
UNIQUE INDEX `uq_post_meta` (`postId` ASC, `key` ASC),
CONSTRAINT `fk_meta_post`
FOREIGN KEY (`postId`)
REFERENCES `blog`.`post` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Prześlij tabelę komentarzy
W tej sekcji zaprojektujemy Tabelę publikowania komentarzy do przechowywania komentarzy do posta. Poniżej znajduje się opis wszystkich kolumn tabeli komentarzy do posta.
Identyfikator | Unikalny identyfikator identyfikujący komentarz do posta. |
Identyfikator posta | Identyfikator wpisu identyfikujący wpis nadrzędny. |
Identyfikator rodzica | Identyfikator rodzica do identyfikacji komentarza rodzica. |
Tytuł | Tytuł komentarza. |
Opublikowane | Może być użyty do określenia, czy komentarz jest publicznie dostępny. |
Utworzono w | Przechowuje datę i godzinę przesłania komentarza. |
Opublikowano w | Przechowuje datę i godzinę opublikowania komentarza. |
Treść | Kolumna używana do przechowywania danych komentarzy. |
Tabela publikowania komentarzy z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `blog`.`post_comment` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`postId` BIGINT NOT NULL,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(100) NOT NULL,
`published` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`publishedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_comment_post` (`postId` ASC),
CONSTRAINT `fk_comment_post`
FOREIGN KEY (`postId`)
REFERENCES `blog`.`post` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `blog`.`post_comment`
ADD INDEX `idx_comment_parent` (`parentId` ASC);
ALTER TABLE `blog`.`post_comment`
ADD CONSTRAINT `fk_comment_parent`
FOREIGN KEY (`parentId`)
REFERENCES `blog`.`post_comment` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabela kategorii i tabela kategorii postów
W tej sekcji zaprojektujemy Tabelę kategorii i Tabela kategorii postów do przechowywania kategorii postów i ich mapowań. Poniżej znajduje się opis wszystkich kolumn tabeli kategorii.
Identyfikator | Unikalny identyfikator do identyfikacji kategorii. |
Identyfikator rodzica | Identyfikator nadrzędny do identyfikacji kategorii nadrzędnej. |
Tytuł | Tytuł kategorii. |
Metatytuł | Metatytuł używany do tytułu przeglądarki i SEO. |
Ślimak | Narzędzie kategorii do utworzenia adresu URL. |
Treść | Kolumna używana do przechowywania danych kategorii. |
Tabela kategorii z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `blog`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
ALTER TABLE `blog`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `blog`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `blog`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Poniżej znajduje się opis wszystkich kolumn tabeli kategorii postów.
Identyfikator posta | Identyfikator posta identyfikujący post. |
Identyfikator kategorii | Identyfikator kategorii do identyfikacji kategorii. |
Tabela kategorii postów z odpowiednimi ograniczeniami jest pokazana poniżej.
CREATE TABLE `blog`.`post_category` (
`postId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`postId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_post` (`postId` ASC),
CONSTRAINT `fk_pc_post`
FOREIGN KEY (`postId`)
REFERENCES `blog`.`post` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `blog`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Tabela tagów i tabela tagów postów
Podobnie jak w przypadku tabel kategorii i postów, możemy zaprojektować Tabelę tagów i Tabela tagów postów . Poniżej wymieniono główne różnice między kategorią a tagiem.
- Kolumna parentId nie jest wymagana w tabeli tagów.
- Liczba kategorii pozostaje niska, ponieważ można ich użyć do utworzenia menu głównego do celów nawigacyjnych. Tagi mogą być większe w porównaniu z kategoriami.
- Zarówno kategorie, jak i tagi mogą być użyte do powiązania postów.
- Do posta należy przypisać tylko kilka kategorii, podczas gdy liczba tagów może być większa.
Podsumowanie
W ten sposób możemy zaprojektować bazę danych blogów, która będzie wykorzystywana do tworzenia witryn internetowych i aplikacji mobilnych opartych na blogach. To samo można dodatkowo ulepszyć, aby dodać bardziej zaawansowane opcje, w tym filmy, płatności, subskrypcje itp.
Możesz przesłać swoje uwagi, aby dołączyć do dyskusji. Możesz być również zainteresowany zaprojektowaniem bazy danych aplikacji Poll &Survey. Projekt RBAC można wykorzystać do implementacji kontroli dostępu opartej na rolach.
Pełny schemat bazy danych jest również dostępny na GitHub.