Skip to the content.

最終更新日:2026年7月17日

まず結論

多対多とは、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を持つ中央の表が、連関エンティティ

© 2024-2026 stemtazoo. All rights reserved.