このチュートリアルでは、ユーザー、ブログ投稿、メタデータの投稿、コメントの投稿、カテゴリの投稿、タグの投稿を管理するためのデータベーススキーマを設計するための完全な手順を提供します。さらに、ブログのWebサイトやモバイルアプリケーションの開発にも使用できます。
実体関連図または視覚的なデータベース設計を以下に示します。
図1
メモ :データベーススキーマをシンプルに保ち、実行可能な最小限の製品を開発するために、バージョン管理や投稿のレビューなどのより高度なオプションについては説明していません。スパムを回避するために投稿者によるコメントを確認するオプションを提供し、正当なコメントのみが公開されて投稿ページに表示されるようにします。
また、UbuntuにMySQL 8をインストールする方法、WindowsにMySQL 8をインストールする方法、MySqlのRBACデータベース、MySqlのポーリングと調査データベース、MySQLの基本的なSQLクエリを学ぶなどの人気のあるチュートリアルにアクセスすることもできます。
ブログデータベース
最初のステップは、ブログデータベースを作成することです。以下に示すクエリを使用して作成できます。
CREATE SCHEMA `blog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
文字セットutf8mb4を使用しました 幅広いキャラクターをサポートします。
ユーザーテーブル
このセクションでは、ユーザーテーブルを設計します すべての投稿者のユーザー情報を保存します。同じテーブルを使用して投稿者を関連付け、すべての作成者が自分の投稿を管理できるようにすることができます。以下は、ユーザーテーブルのすべての列の説明です。
ユーザーを識別するための一意のID。 |
ユーザーの名。 |
ユーザーのミドルネーム。 |
ユーザーの名前。 |
ユーザーの携帯電話番号。ログインと登録の目的で使用できます。 |
ユーザーのメールアドレス。ログインと登録の目的で使用できます。 |
適切なアルゴリズムによって生成されたパスワードハッシュ。プレーンなパスワードの保存は避けなければなりません。 |
この列は、ブログを使用しているユーザーの寿命を計算するために使用できます。 |
ユーザーの最後のログインを識別するために使用できます。 |
各投稿に表示される著者の簡単な紹介。 |
著者ページに表示される著者の詳細。 |
適切な制約のあるユーザーテーブルは次のとおりです。
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) );
投稿テーブル
このセクションでは、投稿テーブルを設計します 投稿データを保存します。以下は、投稿テーブルのすべての列の説明です。
投稿を識別するための一意のID。 |
投稿者を識別するための作成者ID。 |
親の投稿を識別するための親ID。シリーズの親投稿の目次を作成するために使用できます。 |
投稿ページとリストに表示される投稿タイトル。 |
ブラウザのタイトルとSEOに使用されるメタタイトル。 |
URLを形成するための投稿スラッグ。 |
主なハイライトに言及する投稿の概要。 |
投稿が公開されているかどうかを識別するために使用できます。 |
投稿が作成された日時が保存されます。 |
投稿が更新された日時が保存されます。 |
投稿が公開された日時が保存されます。 |
投稿データの保存に使用される列。 |
適切な制約のあるPostTableは次のとおりです。
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;
ポストメタ
投稿メタテーブルは、投稿バナーのURLなどの投稿の追加情報を保存するために使用できます。以下は、投稿メタテーブルのすべての列の説明です。
投稿メタを識別するための一意のID。 |
親投稿を識別するための投稿ID。 |
メタを識別するキー。 |
投稿データの保存に使用される列。 |
適切な制約のあるポストメタテーブルは次のとおりです。
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;
コメントテーブルの投稿
このセクションでは、コメント投稿テーブルを設計します 投稿コメントを保存します。以下は、コメント投稿テーブルのすべての列の説明です。
投稿コメントを識別するための一意のID。 |
親投稿を識別するための投稿ID。 |
親コメントを識別するための親ID。 |
コメントのタイトル。 |
コメントが公開されているかどうかを識別するために使用できます。 |
コメントが送信された日時が保存されます。 |
コメントが公開された日時が保存されます。 |
コメントデータの保存に使用される列。 |
適切な制約のあるコメント投稿テーブルは次のとおりです。
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;
カテゴリテーブルと投稿カテゴリテーブル
このセクションでは、カテゴリテーブルを設計します および投稿カテゴリテーブル 投稿カテゴリとそのマッピングを保存します。以下は、カテゴリテーブルのすべての列の説明です。
カテゴリを識別するための一意のID。 |
親カテゴリを識別するための親ID。 |
カテゴリタイトル。 |
ブラウザのタイトルとSEOに使用されるメタタイトル。 |
URLを形成するためのカテゴリスラッグ。 |
カテゴリデータの保存に使用される列。 |
適切な制約のあるカテゴリテーブルは次のとおりです。
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;
以下は、投稿カテゴリテーブルのすべての列の説明です。
投稿を識別するための投稿ID。 |
カテゴリを識別するためのカテゴリID。 |
適切な制約のある投稿カテゴリテーブルは次のとおりです。
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);
タグテーブルとポストタグテーブル
カテゴリテーブルと投稿カテゴリテーブルと同様に、タグテーブルを設計できます。 およびポストタグテーブル 。カテゴリとタグの主な違いを以下に示します。
- タグテーブルではparentId列は必要ありません。
- カテゴリの数は、ナビゲーション目的でメインメニューを形成するために使用できるため、低いままです。タグは、カテゴリと比較してより多くなる可能性があります。
- カテゴリとタグの両方を使用して、投稿を関連付けることができます。
- 投稿に割り当てるカテゴリはごくわずかですが、タグの数はもっと多くなる可能性があります。
概要
これは、ブログベースのWebサイトおよびモバイルアプリケーションの形成として使用されるブログデータベースを設計する方法です。同じことをさらに強化して、ビデオ、支払い、サブスクリプションなどのより高度なオプションを追加することができます。
コメントを送信して、ディスカッションに参加できます。また、Poll&Surveyアプリケーションのデータベースの設計にも興味があるかもしれません。 RBAC設計は、役割ベースのアクセス制御の実装に使用できます。
完全なデータベーススキーマはGitHubでも入手できます。