【初学者向け】中間テーブルを用いる場面について調べてみた

# はじめに
多対多の関係を表現する中間テーブルですが、具体的に使用する場面が知りたかったので、調べた結果をまとめてみます。
中には純粋に多対多の関係だけを表現するものではないのもあります。





# いいね機能
各ユーザーは複数の投稿（例えば、ツイート、写真、記事など）に「いいね」をつけることができ、各投稿は複数のユーザーから「いいね」をもらうことができます。この関係を実現するためには、「Likes」または「Favorites」といった中間テーブルが必要になります。
以下は一般的な「いいね」機能のためのデータベース設計です。

**Usersテーブル**

| user_id | username | email | 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 | email | ... |
| --------------- | ------------ | ----- | --- |
| 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 | email | ... |
| ------------------- | ---------------- | ----- | --- |
| 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                      |
| ...                                | ...                    |




# 最後に
ここまで読んでいただきありがとうございました！！
ぜひイイね！をよろしくお願いします (*ᴗˬᴗ)⁾⁾
それではまた！(^_^)ﾉｼ