N対Nのモデルとは
複数のモデルAと複数のモデルBが紐づいているデータ設計です。つまり複数対複数。
例
例えば、ユーザーとプロジェクトの関係にしてみましょう。
ユーザー側から見た場合
- ユーザーAはプロジェクト1とプロジェクト2に紐付く
- ユーザーBはプロジェクト1とプロジェクト2に紐付く
- ユーザーCはプロジェクト2とプロジェクト3に紐付く
といった感じです。
プロジェクト側から見た場合
- プロジェクト1はユーザーAとユーザーBに紐付く
- プロジェクト2はユーザーAとユーザーBとユーザーCに紐付く
- プロジェクト3はユーザーCに紐付く
といった感じです。
参考図
データベースでどう表現するか
1対1や1対Nの場合
1対1や1対Nの場合は、片方のテーブルに外部キーを入れます。
例
1人のユーザーは1つのグループにしか属せないN対1の関係は下記のような感じです。
Groupテーブル
id | name |
---|---|
1 | group1 |
2 | group2 |
3 | group3 |
Userテーブル
id | name | group_id(外部キー) |
---|---|---|
1 | user1 | 2 |
2 | user2 | 2 |
3 | user3 | 3 |
4 | user4 | 1 |
N対Nの場合
中間テーブルを作り、中間テーブル側に両者のモデルの外部キーを入れます。
例
1人のユーザーは複数のプロジェクトに所属できる。また、1つのプロジェクトには複数のユーザーが所属する場合。
Projectテーブル
id | name |
---|---|
1 | project1 |
2 | project2 |
3 | project3 |
Userテーブル
id | name |
---|---|
1 | userA |
2 | userB |
3 | userC |
UserProjectテーブル
user_id(外部キー) | project_id(外部キー) |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
2 | 2 |
3 | 2 |
3 | 3 |