最終更新日:2026年7月17日
fe fe-technology database
まず結論
多対多とは、1つのAに複数のBが対応し、1つのBにも複数のAが対応する関係です。
関係データベースでは、多対多をそのまま表にせず、間に連関エンティティを置いて2つの1対多に分解します。
A 多 対 多 B
↓
A 1 対 多 連関エンティティ 多 対 1 B
基本情報技術者試験では、次の判断軸が重要です。
両側のIDを持つ明細・取引・履歴の表が、連関エンティティになりやすい。
直感的な説明
多重度は、表全体に何件あるかでは決めません。
片方を1つに固定したとき、相手が何件対応するかを見ます。
例えば、部品と仕入先を考えます。
部品001
→ 仕入先Z010から仕入れる
→ 別の仕入先からも仕入れることがある
仕入先Z010
→ 部品001を扱う
→ 部品002も扱う
この場合、
1つの部品に複数の仕入先
1つの仕入先に複数の部品
なので、部品と仕入先は多対多です。
ただし、実際の在庫や仕入れの記録は、1件ごとに部品と仕入先が1つずつ決まります。
在庫レコード1件
→ 部品コードは1つ
→ 仕入先コードも1つ
そこで、在庫を間に置きます。
部品 1 ─ 多 在庫 多 ─ 1 仕入先
定義・仕組み
多重度の見方
ER図の「1」「多」は、次の質問で判断します。
1つのAに対して、Bは何件対応するか?
| 確認する関係 | 対応件数 | 多重度 |
|---|---|---|
| 1つの部品に対する在庫レコード | 複数 | 部品1:在庫多 |
| 1件の在庫レコードに対する部品 | 1つ | 在庫多:部品1 |
| 1つの仕入先に対する在庫レコード | 複数 | 仕入先1:在庫多 |
| 1件の在庫レコードに対する仕入先 | 1つ | 在庫多:仕入先1 |
大切なのは、部品や仕入先が表全体に複数あるから「多」なのではないという点です。
連関エンティティ
連関エンティティは、多対多の関係を表すために間に置くエンティティです。
代表例は次のとおりです。
| 左側 | 連関エンティティ | 右側 |
|---|---|---|
| 学生 | 履修 | 科目 |
| 注文 | 注文明細 | 商品 |
| 部品 | 在庫・仕入記録 | 仕入先 |
| 社員 | プロジェクト参加 | プロジェクト |
連関エンティティには、一般に両側の主キーを外部キーとして持たせます。
在庫(
部品コード,
仕入先コード,
仕入日付,
仕入価格,
在庫数
)
この例では、部品コードと仕入先コードが両側をつなぐ情報です。必要に応じて仕入日付なども含め、複合主キーにします。
このテーマは、基本情報技術者試験の「データベース」や「ER図」と関係する内容です。公式の出題範囲やシラバスは、IPA:基本情報技術者試験から確認できます。
科目Aでどう出る?
科目Aでは、表のデータやER図を見て、どのエンティティが中央に入るかを判断する問題が出ます。
例えば、次のER図を考えます。
a 1 ─ 多 b 多 ─ 1 c
中央のbは、次の特徴を持ちます。
1つのaに対してbが複数ある
1つのcに対してbが複数ある
bの1件はaとcを1つずつ持つ
したがって、部品・在庫・仕入先の関係なら次の対応です。
a = 部品
b = 在庫
c = 仕入先
判断手順
1. 1件のレコードに入るIDを見る
2. 片方を1つに固定する
3. 相手のレコードが複数あるか確認する
4. 両側のIDを持つ中央の表を探す
「多」を見つける例
部品001を固定
→ 在庫レコードが複数
→ 部品1:在庫多
仕入先Z010を固定
→ 在庫レコードが複数
→ 仕入先1:在庫多
一方で、在庫レコード1件に記録される部品コードと仕入先コードは、それぞれ1つです。
どんな場面で使う?
多対多は、二つの対象が互いに複数対応する業務で現れます。
学生は複数の科目を履修する
科目には複数の学生が参加する
→ 学生と科目は多対多
1つの注文には複数の商品が入る
1つの商品は複数の注文に入る
→ 注文と商品は多対多
このままでは、関係に付随する情報を保存しにくくなります。
例えば、履修には成績、注文明細には数量や単価、仕入記録には仕入日や価格があります。
そこで連関エンティティを置きます。
学生 1 ─ 多 履修 多 ─ 1 科目
注文 1 ─ 多 注文明細 多 ─ 1 商品
表の分け方や主キーの整理については、データベース正規化とは?第1〜第3正規形を表の分け方で理解するも参考になります。
よくある誤解・混同
| 誤解 | 正しい理解 |
|---|---|
| 表にデータが複数行あるから全部「多」 | 片方を1つに固定し、相手が何件対応するかを見る |
| 在庫は部品そのものである | 在庫は部品と仕入先の関係や取引を表す連関エンティティ |
| 1件の在庫に複数の部品が入る | 通常、1件の在庫レコードには部品コードが1つ入る |
| 多対多はそのまま1本の関係で実装する | 連関エンティティを置き、2つの1対多に分解する |
| 中央の表は必ず「在庫」という名前 | 履修、明細、参加、割当てなど、業務によって名前は変わる |
矢印を読む方向に注意
部品 1 ─ 多 在庫
これは、
1つの部品に複数の在庫レコードがある
1件の在庫レコードが指す部品は1つ
という意味です。
「多」はエンティティ自体の数ではなく、反対側の1件に対して何件対応するかを示します。
まとめ(試験直前用)
- 多重度は、片方を1つに固定して相手の件数を見る
- 1つのAに複数のB、1つのBに複数のAなら多対多
- 多対多は連関エンティティを置き、2つの1対多に分解する
- 連関エンティティは、両側のIDを持つ明細・取引・履歴の表になりやすい
- 在庫1件には、部品と仕入先が1つずつ対応する
- 両側のIDを持つ中央の表が、連関エンティティ