このチュートリアルでは、ソーシャルネットワークシステムのデータベーススキーマを設計して、ユーザー、友達、フォロワー、グループ、メッセージを管理するための完全な手順を説明します。
実体関連図または視覚的なデータベース設計を以下に示します。
ソーシャルネットワークシステムデータベース
また、Ubuntu 20.04LTSにMySQL8をインストールする方法、WindowsにMySQL 8をインストールする方法、UbuntuにMySQL Workbenchをインストールする方法、Windows10にWorkbenchを使用してMySQL8をインストールする方法、MySqlのRBACデータベースなどの人気のあるチュートリアルにアクセスすることもできます。 MySqlのブログデータベース、MySQLのクイズデータベース、MySQLのPoll&Surveyデータベース、MySQLのオンラインショッピングカートデータベース、MySQLのインベントリデータベース、MySQLの基本的なSQLクエリを学ぶ。
ソーシャルネットワークシステムデータベース
最初のステップは、ソーシャルネットワークシステムデータベースを作成することです。以下に示すクエリを使用して作成できます。
CREATE SCHEMA `sns` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
文字セットutf8mb4を使用しました 幅広いキャラクターをサポートします。
ユーザーテーブル
このセクションでは、ユーザーテーブルを設計します ユーザー情報を保存します。以下は、ユーザーテーブルのすべての列の説明です。
ユーザーを識別するための一意のID。 |
ユーザーの名。 |
ユーザーのミドルネーム。 |
ユーザーの名前。 |
ユーザーの携帯電話番号。ログインと登録の目的で使用できます。 |
ユーザーのメールアドレス。ログインと登録の目的で使用できます。 |
適切なアルゴリズムによって生成されたパスワードハッシュ。プレーンなパスワードや暗号化されたパスワードの保存は避けなければなりません。 |
この列は、アプリケーションを使用しているユーザーの寿命を計算するために使用できます。 |
ユーザーの最後のログインを識別するために使用できます。 |
ユーザーの簡単な紹介。 |
ユーザーの詳細。 |
適切な制約のあるユーザーテーブルを以下に示します。
CREATE TABLE `sns`.`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,
`username` 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_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
ユーザーフレンドテーブル
このセクションでは、ユーザーフレンドテーブルを設計します。 ユーザーの友達を保存します。友情ステータスは友情ステータスを追跡するために使用でき、タイプは友情のタイプを指定するために使用できます。以下は、ユーザーフレンドテーブルのすべての列の説明です。
友情を識別するための一意のID。 |
友情を開始したユーザーを識別するためのユーザーID。 |
友達のユーザーID。 |
友達を分類するタイプ。学校、大学、知人のいずれでもかまいません。 |
ステータスは、新規、拒否、またはアクティブになります。 |
フレンドリクエストが開始された日時が保存されます。 |
友達リクエストが更新された日時を保存します。 |
友情に固有のメモを保存します。 |
適切な制約のあるユーザーフレンドテーブルを以下に示します。
CREATE TABLE `sns`.`user_friend` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_friend_source` (`sourceId` ASC),
CONSTRAINT `fk_friend_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_friend`
ADD INDEX `idx_friend_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_friend`
ADD CONSTRAINT `fk_friend_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`user_friend` ADD UNIQUE `uq_friend`(`sourceId`, `targetId`);
ユーザーフォロワーテーブル
このセクションでは、ユーザーフォロワーテーブルを設計します。 ユーザーフォロワーを保存します。フォロワータイプを使用して、「いいね」、「嫌い」、または「フォロー」の中からフォロワーのタイプを指定できます。以下は、ユーザーフォロワーテーブルのすべての列の説明です。
フォロワーを識別するための一意のID。 |
フォロワーユーザーを識別するためのユーザーID。 |
次のユーザーを識別するためのユーザーID。 |
フォロワーを分類するタイプ。 「いいね」、「嫌い」、「フォロー」のいずれかになります。 |
フォロワーが作成された日時を保存します。 |
フォロワーが更新された日時を保存します。 |
適切な制約のあるユーザーフォロワーテーブルを以下に示します。
CREATE TABLE `sns`.`user_follower` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_ufollower_source` (`sourceId` ASC),
CONSTRAINT `fk_ufollower_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_follower`
ADD INDEX `idx_ufollower_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_follower`
ADD CONSTRAINT `fk_ufollower_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`user_follower` ADD UNIQUE `uq_ufollower`(`sourceId`, `targetId`, `type`);
ユーザーメッセージテーブル
このセクションでは、ユーザーメッセージテーブルを設計します。 ユーザーチャットメッセージを保存します。以下は、ユーザーメッセージテーブルのすべての列の説明です。
メッセージを識別するための一意のID。 |
送信者を識別するためのユーザーID。 |
受信者を識別するためのユーザーID。 |
メッセージ本文。 |
メッセージが作成された日時を保存します。 |
メッセージが更新された日時を保存します。 |
適切な制約のあるユーザーメッセージテーブルを以下に示します。
CREATE TABLE `sns`.`user_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_umessage_source` (`sourceId` ASC),
CONSTRAINT `fk_umessage_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_message`
ADD INDEX `idx_umessage_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_message`
ADD CONSTRAINT `fk_umessage_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ユーザー投稿テーブル
このセクションでは、ユーザー投稿テーブルを設計します ユーザーの投稿を保存します。送信者は、適切な権限を持つ他のユーザーがユーザーウォールに投稿できるようにする必要がある場合があります。以下は、ユーザー投稿テーブルのすべての列の説明です。
投稿を識別するための一意のID。 |
対応するユーザーを識別するためのユーザーID。 |
対応する送信者を識別するための送信者ID。 |
メッセージ本文。 |
投稿が作成された日時が保存されます。 |
投稿が更新された日時が保存されます。 |
適切な制約のあるユーザー投稿テーブルを以下に示します。
CREATE TABLE `sns`.`user_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`senderId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_upost_user` (`userId` ASC),
CONSTRAINT `fk_upost_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_post`
ADD INDEX `idx_upost_sender` (`senderId` ASC);
ALTER TABLE `sns`.`user_post`
ADD CONSTRAINT `fk_upost_sender`
FOREIGN KEY (`senderId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
グループテーブル
このセクションでは、グループテーブルを設計します グループデータを保存します。以下は、グループテーブルのすべての列の説明です。
グループを識別するための一意のID。 |
グループを登録したユーザーを識別するためのユーザーID。 |
グループを更新したユーザーを識別するためのユーザーID。 |
グループタイトル。 |
ブラウザのタイトルとSEOの目的で使用されるメタタイトル。 |
一意のURLを形成するためのスラッグ。 |
主なハイライトに言及する要約。 |
グループのステータスは、新規、承認済み、アクティブ、またはブロック済みです。 |
グループが作成された日時を保存します。 |
グループが更新された日時を保存します。 |
グループのプロファイルの詳細を格納するために使用される列。 |
グループの追加の詳細を格納するために使用される列。 |
列ステータスを使用して、グループのステータスを追跡します。ステータスは、新規、承認済み、アクティブ、またはブロック済みのいずれかになります。適切な制約のあるグループテーブルは次のとおりです。
CREATE TABLE `sns`.`group` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`createdBy` BIGINT NOT NULL,
`updatedBy` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_group_creator` (`createdBy` ASC),
CONSTRAINT `fk_group_creator`
FOREIGN KEY (`createdBy`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group`
ADD INDEX `idx_group_modifier` (`updatedBy` ASC);
ALTER TABLE `sns`.`group`
ADD CONSTRAINT `fk_group_modifier`
FOREIGN KEY (`updatedBy`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
グループメタ
グループメタテーブルは、グループバナーURLなどのグループに関する追加情報を格納するために使用できます。以下は、グループメタテーブルのすべての列の説明です。
グループメタを識別するための一意のID。 |
親グループを識別するためのグループID。 |
メタを識別するキー。 |
グループのメタデータを格納するために使用される列。 |
適切な制約のあるグループメタテーブルは次のとおりです。
CREATE TABLE `sns`.`group_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_group` (`groupId` ASC),
UNIQUE INDEX `uq_meta_group` (`groupId` ASC, `key` ASC),
CONSTRAINT `fk_meta_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
グループメンバーテーブル
このセクションでは、グループメンバーテーブルを設計します。 グループメンバーを保存します。メンバーステータスはメンバーシップステータスを追跡するために使用でき、メンバーロールはメンバー特権を識別するために使用できます。以下は、グループメンバーテーブルのすべての列の説明です。
メンバーシップを識別するための一意のID。 |
対応するグループを識別するためのグループID。 |
対応するユーザーを識別するためのユーザーID。 |
ユーザー権限を確認する役割。 |
ステータスは、[新規]、[拒否]、[アクティブ]、または[ブロック]のいずれかになります。 |
メンバーリクエストが開始された日時が保存されます。 |
メンバーが更新された日時を保存します。 |
メンバーシップに固有のメモを保存します。 |
適切な制約のあるグループメンバーテーブルを以下に示します。
CREATE TABLE `sns`.`group_member` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_member_group` (`groupId` ASC),
CONSTRAINT `fk_member_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_member`
ADD INDEX `idx_member_user` (`userId` ASC);
ALTER TABLE `sns`.`group_member`
ADD CONSTRAINT `fk_member_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`group_member` ADD UNIQUE `uq_friend`(`groupId`, `userId`);
グループフォロワーテーブル
このセクションでは、グループフォロワーテーブルを設計します グループフォロワーを保存します。フォロワーのタイプは、「いいね」、「嫌い」、または「フォロー」です。以下は、グループフォロワーテーブルのすべての列の説明です。
フォロワーを識別するための一意のID。 |
対応するグループを識別するためのグループID。 |
対応するユーザーを識別するためのユーザーID。 |
フォロワーの種類は、「いいね」、「嫌い」、「フォロー」のいずれかになります。 |
フォロワーが作成された日時を保存します。 |
フォロワーが更新された日時を保存します。 |
適切な制約のあるグループフォロワーテーブルを以下に示します。
CREATE TABLE `sns`.`group_follower` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gfollower_group` (`groupId` ASC),
CONSTRAINT `fk_gfollower_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_follower`
ADD INDEX `idx_gfollower_user` (`userId` ASC);
ALTER TABLE `sns`.`group_follower`
ADD CONSTRAINT `fk_gfollower_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`group_follower` ADD UNIQUE `uq_friend`(`groupId`, `userId`, `type`);
グループメッセージテーブル
このセクションでは、グループメッセージテーブルを設計します。 グループチャットメッセージを保存します。以下は、グループメッセージテーブルのすべての列の説明です。
メッセージを識別するための一意のID。 |
対応するグループを識別するためのグループID。 |
対応するユーザーを識別するためのユーザーID。 |
メッセージ本文。 |
メッセージが作成された日時を保存します。 |
メッセージが更新された日時を保存します。 |
適切な制約のあるグループメッセージテーブルを以下に示します。
CREATE TABLE `sns`.`group_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gmessage_group` (`groupId` ASC),
CONSTRAINT `fk_gmessage_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_message`
ADD INDEX `idx_gmessage_user` (`userId` ASC);
ALTER TABLE `sns`.`group_message`
ADD CONSTRAINT `fk_gmessage_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
グループ投稿テーブル
このセクションでは、グループ投稿テーブルを設計します グループの投稿を保存します。適切な役割を持つメンバーは、グループに投稿できます。以下は、グループ投稿テーブルのすべての列の説明です。
投稿を識別するための一意のID。 |
対応するグループを識別するためのグループID。 |
対応するユーザーを識別するためのユーザーID。 |
メッセージ本文。 |
投稿が作成された日時が保存されます。 |
投稿が更新された日時が保存されます。 |
適切な制約のあるグループ投稿テーブルを以下に示します。
CREATE TABLE `sns`.`group_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gpost_group` (`groupId` ASC),
CONSTRAINT `fk_gpost_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_post`
ADD INDEX `idx_gpost_user` (`userId` ASC);
ALTER TABLE `sns`.`group_post`
ADD CONSTRAINT `fk_gpost_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
概要
このチュートリアルでは、ユーザー、友達、フォロワー、メッセージ、グループを管理するためのソーシャルネットワークシステムのデータベース設計について説明しました。
コメントを送信して、ディスカッションに参加できます。ブログ、ショッピングカート、および投票と調査のアプリケーションのデータベースの設計にも興味があるかもしれません。完全なデータベーススキーマはGitHubでも入手できます。