はじめに
多対多の関係を表現する中間テーブルですが、具体的に使用する場面が知りたかったので、調べた結果をまとめてみます。
中には純粋に多対多の関係だけを表現するものではないのもあります。
いいね機能
各ユーザーは複数の投稿(例えば、ツイート、写真、記事など)に「いいね」をつけることができ、各投稿は複数のユーザーから「いいね」をもらうことができます。この関係を実現するためには、「Likes」または「Favorites」といった中間テーブルが必要になります。
以下は一般的な「いいね」機能のためのデータベース設計です。
Usersテーブル
user_id | username | password | ... | |
---|---|---|---|---|
1 | user1 | user1@example.com | **** | ... |
2 | user2 | user2@example.com | **** | ... |
3 | user3 | user3@example.com | **** | ... |
... | ... | ... | ... | ... |
Postsテーブル
post_id | user_id | title | content | timestamp | ... |
---|---|---|---|---|---|
1 | 1 | title1 | content1 | 2023-01-01 12:00:00 | ... |
2 | 2 | title2 | content2 | 2023-01-02 12:00:00 | ... |
3 | 1 | title3 | content3 | 2023-01-03 12:00:00 | ... |
... | ... | ... | ... | ... | ... |
Likesテーブル
user_id | post_id | timestamp |
---|---|---|
1 | 2 | 2023-01-02 12:30:00 |
2 | 1 | 2023-01-02 12:45:00 |
3 | 1 | 2023-01-02 13:00:00 |
... | ... | ... |
ブックマーク機能
ブックマーク機能を実装するためのテーブル設計は、「いいね」機能の設計と非常に似ています。
以下に、基本的なブックマーク機能のためのテーブル設計を表現します。
Usersテーブル
(同上)
Postsテーブル
(同上)
Bookmarksテーブル
user_id | post_id | timestamp |
---|---|---|
1 | 2 | 2023-01-02 12:30:00 |
2 | 1 | 2023-01-02 12:45:00 |
3 | 1 | 2023-01-02 13:00:00 |
... | ... | ... |
コメント機能
各ユーザーは複数の投稿にコメントをすることができ、各投稿は複数のユーザーからコメントをもらうことができます。しかし、Commentsのようなテーブルは、それ自体が独立したエンティティ(コメント)を表現しています。
Usersテーブル
(同上)
Postsテーブル
(同上)
Commentsテーブル
comment_id | user_id | post_id | content | timestamp |
---|---|---|---|---|
1 | 2 | 1 | "Nice post!" | 2023-01-02 12:45:00 |
2 | 3 | 1 | "I agree." | 2023-01-02 13:00:00 |
3 | 1 | 2 | "Interesting." | 2023-01-02 13:15:00 |
... | ... | ... | ... | ... |
フォロー機能
フォロー機能はユーザーとユーザーの間の多対多の関係を持ちます。ユーザーは複数のユーザーをフォローすることができ、各ユーザーは複数のフォロワーを持つことができます。この関係を管理するためには中間テーブル(例えば「Follows」や「Relationships」テーブルなど)が必要です。
フォロー機能を実装するためのテーブル設計は以下のようになります。
Usersテーブル
(同上)
Relationshipsテーブル
follower_id | followed_id |
---|---|
1 | 2 |
1 | 3 |
2 | 3 |
... | ... |
ここでの「follower_id」はフォローする側のユーザーを、「followed_id」はフォローされる側のユーザーを表しています。
タグ機能
各記事(または商品など)は複数のタグを持つことができ、各タグは複数の記事(または商品)に関連付けられることがあります。この関係を管理するためには、ArticlesTagsのような中間テーブルが必要となります。
以下に、基本的な記事(商品)とタグのためのテーブル設計を表現します。
Articlesテーブル (あるいは Productsテーブル)
Article_id | user_id | title | content | timestamp | ... |
---|---|---|---|---|---|
1 | 1 | title1 | content1 | 2023-01-01 12:00:00 | ... |
2 | 2 | title2 | content2 | 2023-01-02 12:00:00 | ... |
3 | 1 | title3 | content3 | 2023-01-03 12:00:00 | ... |
... | ... | ... | ... | ... | ... |
Tagsテーブル
tag_id | tag_name |
---|---|
1 | tag1 |
2 | tag2 |
3 | tag3 |
... | ... |
ArticlesTagsテーブル (あるいは ProductsTagsテーブル)
Article_id | tag_id |
---|---|
1 | 2 |
2 | 1 |
2 | 3 |
... | ... |
ユーザーとグループ
各ユーザーは複数のグループに所属することができ、各グループは複数のユーザーを含むことができます。この関係を管理するためには、UsersGroupsのような中間テーブルが必要となります。
以下に、基本的なユーザーとグループのためのテーブル設計を表現します。
Usersテーブル
(同上)
Groupsテーブル
group_id | group_name | ... |
---|---|---|
1 | group1 | ... |
2 | group2 | ... |
3 | group3 | ... |
... | ... | ... |
UsersGroupsテーブル
user_id | group_id |
---|---|
1 | 2 |
2 | 1 |
2 | 3 |
... | ... |
受講生と講座
各受講生は複数の講座を受けることができ、各講座は複数の受講生を持つことができます。この関係を管理するためには、StudentsCoursesのような中間テーブルが必要となります。
以下に、基本的な受講生と講座のためのテーブル設計を表現します。
Studentsテーブル
student_id | student_name | ... | |
---|---|---|---|
1 | student1 | student1@example.com | ... |
2 | student2 | student2@example.com | ... |
3 | student3 | student3@example.com | ... |
... | ... | ... | ... |
Coursesテーブル
course_id | course_name | ... |
---|---|---|
1 | course1 | ... |
2 | course2 | ... |
3 | course3 | ... |
... | ... | ... |
StudentsCoursesテーブル
student_id | course_id |
---|---|
1 | 2 |
2 | 1 |
2 | 3 |
... | ... |
イベントと参加者
各イベントは複数の参加者を持つことができ、各参加者は複数のイベントに参加することができます。この関係を管理するためには、EventsParticipantsのような中間テーブルが必要となります。
以下に、基本的なイベントと参加者のためのテーブル設計を表現します。
Participantsテーブル
participant_id | participant_name | ... | |
---|---|---|---|
1 | participant1 | participant1@example.com | ... |
2 | participant2 | participant2@example.com | ... |
3 | participant3 | participant3@example.com | ... |
... | ... | ... | ... |
Eventsテーブル
event_id | event_name | event_date | ... |
---|---|---|---|
1 | event1 | 2023-01-01 | ... |
2 | event2 | 2023-02-01 | ... |
3 | event3 | 2023-03-01 | ... |
... | ... | ... | ... |
EventsParticipantsテーブル
participant_id | event_id |
---|---|
1 | 2 |
2 | 1 |
2 | 3 |
... | ... |
最後に
ここまで読んでいただきありがとうございました!!
ぜひイイね!をよろしくお願いします (*ᴗˬᴗ)⁾⁾
それではまた!(^_^)ノシ