---
title: "多対多の関係とは？連関エンティティで1対多に分解する方法【基本情報技術者試験】"
description: "ER図の多対多を、1つのエンティティを固定したときに相手が何件対応するかで判断し、連関エンティティを使って2つの1対多に分解する方法を解説します。部品・仕入先・在庫のような関係をFE試験で切れるように整理します。"
last_modified_at: "2026-07-17"
canonical_url: "https://stemtazoo.github.io/fe/many-to-many-associative-entity/"
section: "fe"
---

## まず結論

多対多とは、**1つのAに複数のBが対応し、1つのBにも複数のAが対応する関係**です。

関係データベースでは、多対多をそのまま表にせず、間に**連関エンティティ**を置いて2つの1対多に分解します。

```text
A 多 対 多 B
      ↓
A 1 対 多 連関エンティティ 多 対 1 B
```

基本情報技術者試験では、次の判断軸が重要です。

> **両側のIDを持つ明細・取引・履歴の表が、連関エンティティになりやすい。**

## 直感的な説明

多重度は、表全体に何件あるかでは決めません。

**片方を1つに固定したとき、相手が何件対応するか**を見ます。

例えば、部品と仕入先を考えます。

```text
部品001
→ 仕入先Z010から仕入れる
→ 別の仕入先からも仕入れることがある

仕入先Z010
→ 部品001を扱う
→ 部品002も扱う
```

この場合、

```text
1つの部品に複数の仕入先
1つの仕入先に複数の部品
```

なので、部品と仕入先は多対多です。

ただし、実際の在庫や仕入れの記録は、1件ごとに部品と仕入先が1つずつ決まります。

```text
在庫レコード1件
→ 部品コードは1つ
→ 仕入先コードも1つ
```

そこで、在庫を間に置きます。

```text
部品 1 ─ 多 在庫 多 ─ 1 仕入先
```

## 定義・仕組み

### 多重度の見方

ER図の「1」「多」は、次の質問で判断します。

```text
1つのAに対して、Bは何件対応するか？
```

| 確認する関係 | 対応件数 | 多重度 |
|---|---:|---|
| 1つの部品に対する在庫レコード | 複数 | 部品1：在庫多 |
| 1件の在庫レコードに対する部品 | 1つ | 在庫多：部品1 |
| 1つの仕入先に対する在庫レコード | 複数 | 仕入先1：在庫多 |
| 1件の在庫レコードに対する仕入先 | 1つ | 在庫多：仕入先1 |

大切なのは、**部品や仕入先が表全体に複数あるから「多」なのではない**という点です。

### 連関エンティティ

連関エンティティは、多対多の関係を表すために間に置くエンティティです。

代表例は次のとおりです。

| 左側 | 連関エンティティ | 右側 |
|---|---|---|
| 学生 | 履修 | 科目 |
| 注文 | 注文明細 | 商品 |
| 部品 | 在庫・仕入記録 | 仕入先 |
| 社員 | プロジェクト参加 | プロジェクト |

連関エンティティには、一般に両側の主キーを外部キーとして持たせます。

```text
在庫(
  部品コード,
  仕入先コード,
  仕入日付,
  仕入価格,
  在庫数
)
```

この例では、部品コードと仕入先コードが両側をつなぐ情報です。必要に応じて仕入日付なども含め、複合主キーにします。

このテーマは、基本情報技術者試験の「データベース」や「ER図」と関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html)から確認できます。

## 科目Aでどう出る？

科目Aでは、表のデータやER図を見て、どのエンティティが中央に入るかを判断する問題が出ます。

例えば、次のER図を考えます。

```text
a 1 ─ 多 b 多 ─ 1 c
```

中央の`b`は、次の特徴を持ちます。

```text
1つのaに対してbが複数ある
1つのcに対してbが複数ある
bの1件はaとcを1つずつ持つ
```

したがって、部品・在庫・仕入先の関係なら次の対応です。

```text
a = 部品
b = 在庫
c = 仕入先
```

### 判断手順

```text
1. 1件のレコードに入るIDを見る
2. 片方を1つに固定する
3. 相手のレコードが複数あるか確認する
4. 両側のIDを持つ中央の表を探す
```

### 「多」を見つける例

```text
部品001を固定
→ 在庫レコードが複数
→ 部品1：在庫多
```

```text
仕入先Z010を固定
→ 在庫レコードが複数
→ 仕入先1：在庫多
```

一方で、在庫レコード1件に記録される部品コードと仕入先コードは、それぞれ1つです。

## どんな場面で使う？

多対多は、二つの対象が互いに複数対応する業務で現れます。

```text
学生は複数の科目を履修する
科目には複数の学生が参加する
→ 学生と科目は多対多
```

```text
1つの注文には複数の商品が入る
1つの商品は複数の注文に入る
→ 注文と商品は多対多
```

このままでは、関係に付随する情報を保存しにくくなります。

例えば、履修には成績、注文明細には数量や単価、仕入記録には仕入日や価格があります。

そこで連関エンティティを置きます。

```text
学生 1 ─ 多 履修 多 ─ 1 科目
```

```text
注文 1 ─ 多 注文明細 多 ─ 1 商品
```

表の分け方や主キーの整理については、[データベース正規化とは？第1〜第3正規形を表の分け方で理解する](https://stemtazoo.github.io/fe/database-normalization/)も参考になります。

## よくある誤解・混同

| 誤解 | 正しい理解 |
|---|---|
| 表にデータが複数行あるから全部「多」 | 片方を1つに固定し、相手が何件対応するかを見る |
| 在庫は部品そのものである | 在庫は部品と仕入先の関係や取引を表す連関エンティティ |
| 1件の在庫に複数の部品が入る | 通常、1件の在庫レコードには部品コードが1つ入る |
| 多対多はそのまま1本の関係で実装する | 連関エンティティを置き、2つの1対多に分解する |
| 中央の表は必ず「在庫」という名前 | 履修、明細、参加、割当てなど、業務によって名前は変わる |

### 矢印を読む方向に注意

```text
部品 1 ─ 多 在庫
```

これは、

```text
1つの部品に複数の在庫レコードがある
1件の在庫レコードが指す部品は1つ
```

という意味です。

「多」はエンティティ自体の数ではなく、**反対側の1件に対して何件対応するか**を示します。

## まとめ（試験直前用）

- 多重度は、片方を1つに固定して相手の件数を見る
- 1つのAに複数のB、1つのBに複数のAなら多対多
- 多対多は連関エンティティを置き、2つの1対多に分解する
- 連関エンティティは、両側のIDを持つ明細・取引・履歴の表になりやすい
- 在庫1件には、部品と仕入先が1つずつ対応する
- **両側のIDを持つ中央の表が、連関エンティティ**
