エンティティを知ることでわかること
-
多対多(N:M)
→ 2つのテーブルの間に 中間テーブル を作る必要がある -
1対多(1:N)
→ 「多」の側のテーブルは「1」の側のテーブルの主キーを 外部キー として持つ必要がある
また、
-
「1」の側のテーブルは「多」の側にとっての 親エンティティ
-
「多」の側のテーブルは「1」の側にとっての 子エンティティ
となる
なぜ子エンティティが親エンティティの主キーを外部キーとして持つ必要があるのか
MySQL 公式サンプルデータベースの'employee data' の給与テーブル(salaries)と従業員テーブル(employees)を使って考えていきます。
給与明細の一行(以下給与)は一人の従業員のもの
一人の従業員は複数の給与をもつ
↓
従業員と給与は1と多(1:N)
↓
* 従業員テーブルの主キーであるemp_noを
* 給与テーブルの外部キーにする
↓なぜなら
従業員テーブルの一行(一人分の従業員のデータ)には一つの給与しか格納できない
↓
給与テーブルにで、どの従業員がいくらの給与をもらったかを紐づける必要がある
なぜ中間テーブルを作る必要があるのか
MySQL 公式サンプルデータベースの 'employee data' の部署テーブル(departments)と従業員テーブル(employees)を使って考えていきます。
1つの部署には複数の従業員が所属する。
1人の従業員は複数の部署に所属していた履歴がある
↓
部署と従業員の関係は多と多(N:M)である。
↓
* 従業員テーブルの主キーであるemp_noを
* 部署テーブルの外部キーにできない
↓なぜなら
一つの部署レコードにつきemp_noを1つしか格納できない
↓同じく
* 部署テーブルの主キーであるdept_noを
* 従業員テーブルの外部キーにできない
↓なぜなら
一人の従業員レコードにつきdept_noを1つしか格納できない
↓
複数の従業員と複数の部署のデータを互いに紐づけられる
中間テーブルを作る必要がある
↓
従業員の主キーであるemp_noとdept_noをもつ
部署従業員テーブル(dept_emp)が中間テーブルとして作られる
↓
この中間テーブルは
従業員 と 部署 の両方(親エンティティ)にとっての子エンティティ にあたる
結論
多対多 (N:M) の関係が存在する場合、
→ 2つのテーブルの主キーを外部キーとして持つ 中間テーブル を作成する必要がある
1対多 (1:N) の関係の場合、
→ 「多」の側のテーブルが、「1」の側の主キーを 外部キー としてもつ必要がある