sql >> データベース >  >> RDS >> Mysql

MySQLでソーシャルネットワークシステムのデータベースを設計するためのガイド

    このチュートリアルでは、ソーシャルネットワークシステムのデータベーススキーマを設計して、ユーザー、友達、フォロワー、グループ、メッセージを管理するための完全な手順を説明します。

    実体関連図または視覚的なデータベース設計を以下に示します。

    ソーシャルネットワークシステムデータベース

    また、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 ミドルネーム モバイル メール パスワードハッシュ 登録場所 最終ログイン はじめに プロフィール
    ユーザーを識別するための一意の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 タイプ ステータス 作成場所 更新日 メモ
    友情を識別するための一意の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 タイプ 作成場所 更新日
    フォロワーを識別するための一意の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 メッセージ 作成場所 更新日
    メッセージを識別するための一意の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 メッセージ 作成場所 更新日
    投稿を識別するための一意の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。
    グループを更新したユーザーを識別するためのユーザー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 キー コンテンツ
    グループメタを識別するための一意の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 ロールID ステータス 作成場所 更新日 メモ
    メンバーシップを識別するための一意の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 タイプ 作成場所 更新日
    フォロワーを識別するための一意の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 メッセージ 作成場所 更新日
    メッセージを識別するための一意の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 メッセージ 作成場所 更新日
    投稿を識別するための一意の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でも入手できます。


    1. MySQLで文字列と数値を連結する

    2. ClusterControlを使用してMariaDB10.3を管理する方法

    3. データベースセキュリティ101:オープンソースデータベースのセキュリティ

    4. 12.2 RAC/GIの新機能