中間テーブル、多対多の関係とは?

f:id:endoakak:20200725102930j:plain

中間テーブルとは、多対多の関係にある二つのテーブルの間に入る、第三のテーブルのことです。なかなかイメージがつきづらいので、具体例を挙げて解説してみます。

一対多の関係

中間テーブルを考える前に、一対多の関係について考えます。

例えば、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

まとめ

  • 中間テーブルは多対多の関係にある二つのテーブルをつなぐテーブル
  • 中間テーブルによって、カラムが際限なく増えるのを防げぐことができる