はじめに
多対多のテーブル構造について分かったようでわかっていなかったので深堀していこうと思います。
概要
SNSなどで一般的な投稿に対して複数のいいね!がつくような仕様のテーブル構造を考えます。
ER図は以下。
分解して考える
これだけで理解できれば問題ないのですが、「?」となった人、読み進めてください。
まず、ユーザーには「投稿をするユーザー」と「いいねをするユーザー」がいますが、実際には同じユーザーが両方の行動を行います。
今回は「いいね!」という行為に絞って話を進めていきます。
- ユーザーは複数の投稿にいいねをすることができる
- 投稿は複数のユーザーからいいねを受け取ることができる
この状態では、usersテーブルとpostsテーブルの間には1対多の関係が存在します。しかし、ユーザーと投稿の間には「いいね」を介した多対多の関係があります。この多対多の関係を管理するために、中間テーブルとしてlikesテーブルを使用します。
likesテーブルは、user_idとpost_idの2つの外部キーを持ち、ユーザーがどの投稿にいいねをしたかを管理します。これにより、ユーザーと投稿の間の多対多の関係を効率的に追跡することができます。
図解する
図解すると以下のようになります。
投稿するユーザー
いいねをするユーザーと投稿につくいいねの関係
データ例
users テーブル
id | name | |
---|---|---|
1 | Alice | alice@example.com |
2 | Bob | bob@example.com |
posts テーブル
id | header | body | user_id |
---|---|---|---|
1 | Post 1 | Content 1 | 1 |
2 | Post 2 | Content 2 | 2 |
likes テーブル
id | user_id | post_id |
---|---|---|
1 | 1 | 2 |
2 | 2 | 1 |
3 | 1 | 1 |
このデータ構造により、ユーザーAliceがPost 2とPost 1にいいねをし、ユーザーBobがPost 1にいいねをしたことがわかります。つまり、中間テーブル(likes)は多対多の関係を管理しています。
まとめ
中間テーブル(likes)を使用することで、「ユーザー」と「投稿」の間の多対多の関係を管理できます。これにより、各ユーザーがどの投稿にいいねをしたか、各投稿にどのユーザーがいいねをしたかを効率的に追跡できます。
参考
以下、参考にさせていただきました!
やさしい図解で学ぶ 中間テーブル 多対多 概念編