中間テーブル、多対多の関係とは?
中間テーブルとは、多対多の関係にある二つのテーブルの間に入る、第三のテーブルのことです。なかなかイメージがつきづらいので、具体例を挙げて解説してみます。
一対多の関係
中間テーブルを考える前に、一対多の関係について考えます。
例えば、namesテーブルとappsテーブルの二つのテーブルがあるとします。
name_id | name |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
app_id | app |
---|---|
1 | app1 |
2 | app2 |
3 | app3 |
4 | app4 |
5 | app5 |
6 | app6 |
7 | app7 |
8 | app8 |
一人が複数のappを作成した場合、一つのnameに対して複数のappが紐づきます。
一方で、一つのappは必ず誰か一人によって作られたとすると、一つのappに対して一つのnameが紐づきます。
このような場合、appsテーブルにname_idのカラムを一つ加えることで関連づけることができ、誰がどのappを作ったという情報を記録することができます。
name_id | name |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
app_id | app | name_id |
---|---|---|
1 | app1 | 1 |
2 | app2 | 4 |
3 | app3 | 4 |
4 | app4 | 2 |
5 | app5 | 3 |
6 | app6 | 4 |
7 | app7 | 1 |
8 | app8 | 2 |
このような関係を、一対多の関係と言います。
多対多の関係
では、多対多の関係を見ていきましょう。
例えば、appsテーブルではなくlanguagesテーブルがあったとします。
name_id | name |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
language_id | language |
---|---|
1 | java |
2 | PHP |
3 | Python |
4 | Ruby |
5 | Go |
この場合、一人の人が複数の言語を扱うことができ、さらに一つの言語は複数の人によって扱われます。
先ほどのappと同じように紐付け用とすると下のようになってしまいます。
language_id | language | name_id_1 | name_id_2 | name_id_3 |
---|---|---|---|---|
1 | java | 1 | ||
2 | PHP | 1 | 2 | |
3 | Python | 3 | ||
4 | Ruby | 1 | 3 | 4 |
5 | Go | 4 |
その言語を扱える人が増えるたびにカラムが増え、しかも空の部分が多くなっています。
このような状況を解決するのが、中間テーブルです。
下のようなname_languagesテーブルを作成することで、誰かが言語を習得してもカラムが増えることは無くなり、かつnameとlanguageを紐づけることができます。
id | name_id | language_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 4 |
4 | 2 | 2 |
5 | 3 | 3 |
6 | 3 | 4 |
7 | 4 | 4 |
8 | 4 | 5 |
まとめ
- 中間テーブルは多対多の関係にある二つのテーブルをつなぐテーブル
- 中間テーブルによって、カラムが際限なく増えるのを防げぐことができる