この記事ではTwitterのサイトのER図の書き方を解説します。
論理設計の対象はTwitterの一部の機能に限定し、ER図はIE記法で、Draw.ioで作成しました。
対象の機能
- ユーザを表示する
- ツイートする
- ツイートに返信する
- リツイートする
- 引用ツイートする
- フォローする
- フォロー一覧を表示する
- フォロワー一覧を表示する
- リストにユーザーを追加する
- リスト一覧を表示する
- リストをフォローする
ER図
テーブル定義
usersテーブル
ユーザーの情報を管理するテーブル
- username
@
から始まるアカウント固有の識別名(ユーザー名)
- name
- 表示名(名前)
- bio
- 自己紹介
- location
- 場所
- website
- ウェブサイト
- date_of_birth
- 生年月日
- profile_image
- プロフィール画像
- header_image
- ヘッダー画像
tweetsテーブル
ユーザーのツイートを管理するテーブル
- user_id
- ツイートしたユーザーのid
- content
- ツイート文
- image
- ツイート画像
- reply_to
- 返信の場合、返信先のツイートのidが入る
- 通常のツイートの場合はnull(または0)が入る
- quote_tweet_id
- 引用ツイートの場合、引用元のツイートのidが入る
- 通常ツイートの場合、null(または0)が入る
retweetsテーブル
リツイートしたユーザーとリツイートされたツイートの関連を表すテーブル(誰がどのツイートをリツイートしたかの情報を持つテーブル)
- user_id
- リツイートしたユーザーのid
- tweet_id
- リツイートされたツイートのid
followsテーブル
フォローしたユーザーとフォローされたユーザーの関連を表すテーブル(誰をフォローして誰にフォローされているかの情報を持つテーブル)
- follower_id
- フォローという行為をしたユーザーのid(誰かをフォローしたユーザーのid = 誰かのフォロワーになるユーザーのid)
- followee_id
- フォローの対象となるユーザーのid(誰かにフォローされているユーザーのid)
listsテーブル
リストの情報を管理するテーブル
- user_id
- リストを作成したユーザーのid(リストの所有者)
- name
- リストの名前
- description
- リストの詳細
- header_image
- ヘッダー画像
- is_private
- リストの公開・非公開の状態を表す
list_membersテーブル
リストとそのリストに所属するユーザーの関連を表すテーブル(誰がどのリストに所属するかの情報を持つテーブル)
- user_id
- リストに所属するユーザーのid
- list_id
- ユーザーが所属するリストのid
follow_listsテーブル
リストとそのリストをフォローしているユーザーの関連を表すテーブル(誰がどのリストをフォローしているかの情報を持つテーブル)
- user_id
- リストをフォローしているユーザーのid
- list_id
- ユーザーがフォローしているリストのid
解説
tweetsテーブルについて
- ツイートへの返信機能に関して、ツイートの階層構造を隣接リストモデルで表現(tweetsテーブルを自己参照する形)
- 自己参照に関して、ER図の多重度は、親のツイートが0か1か、子のツイートが0か複数か
- 引用ツイートは通常のツイートと同様に本文や画像を追加できるため、tweetsテーブルで管理
【レコードの例】
id | user_id | content | image | reply_to | quote_tweet_id |
---|---|---|---|---|---|
1 | 1 | Twitter始めました | null | null | null |
2 | 2 | 待ってました! | null | 1 | null |
3 | 1 | よろしくです | null | 2 | null |
4 | 3 | AさんがTwitterを始めたそうです | null | null | 1 |
5 | 4 | マジか | null | 4 | null |
6 | 4 | フォローしましたー | null | 1 | null |
フォローについて
- usersテーブルとfollowsテーブルの関連について、2本の矢印はfollowerとfolloweeのものと考えれば良い(フォロー機能だけを見れば、followerとfolloweeを抽象化してまとめたものがusersテーブルと考えられる)
【レコードの例】
id | follower_id | followee_id |
---|---|---|
1 | 1 | 2 |
1 | 1 | 3 |
1 | 2 | 1 |
1 | 3 | 1 |
【参考】