こんにちは、akiyoko です。
今回はデータベース設計の話です。
分かりそうでよく分からない、「一対一」「一対多」「多対多」のリレーションを分かりやすく説明してみます。
一対一リレーション
分かりやすい定義
- 双方のレコードが一対一に対応する
あるいは、
- 双方の主キーが同じ
設計例
一対一リレーションは、分割しなくてもよいテーブルが分割されている状態です。既存のテーブル構成を変えずに項目を追加したい場合などを除き、積極的に使用する機会はあまり無いように思います。
一対多リレーション
分かりやすい定義
- A のレコードは B の複数のレコードと関連する可能性があるが、B のレコードは A のレコードと最大一件のみ関連する
もう少し詳しく説明すると、
- A から見れば、A の 1つのレコードが同時に複数の B のレコードと関連している(関連のないレコードもある)
- B から見れば、B の 1つのレコードが A の 1つのレコードのみと関連している(関連のないレコードもある)
分かりやすい具体例
- 例1)A:ブログの投稿者、B:ブログの投稿
- 例2)A:顧客、B:注文
- 例3)A:注文、B:注文明細
- 例4)A:部署、B:従業員
設計例
A(一側)は、正規化によって B(多側)から分割されたテーブルである場合が多いです。
一対多リレーションでは、一側のテーブルの主キーを参照する外部キーを、多側のテーブルに設けて対応する場合が多いでしょう。
多対多リレーション
分かりやすい定義
- A のレコードは B の複数のレコードと関連する可能性があり、B のレコードも A の複数のレコードと関連する可能性がある
もう少し詳しく説明すると、
- A から見れば、A の 1つのレコードが同時に複数の B のレコードと関連している(関連のないレコードもある)
- B から見れば、B の 1つのレコードが同時に複数の A のレコードと関連している(関連のないレコードもある)
設計例
多対多リレーションでは、双方に外部キーを設け、中間テーブルを利用するケースが多いでしょう。