ER図を学ぶうえで「1対多」「多対多」という言葉は必ずといっていいほど登場します。
しかし「なんとなく意味はわかるけれど、実際にER図でどう表現するのかわからない」という方も多いのではないでしょうか。
リレーションの種類を正しく理解することは、データベース設計の精度を高めるうえで欠かせない知識です。
この記事では、ER図における1対1・1対多・多対多のリレーションの意味から、カーディナリティ・多重度・外部キー・複合キーの概念まで、図を使ってわかりやすく解説します。
ER図のリレーションは「1対1」「1対多」「多対多」の3種類が基本
それではまず、ER図におけるリレーションの種類という結論から解説していきます。
エンティティ同士の関係性を表すリレーションには、「1対1(1:1)」「1対多(1:N)」「多対多(M:N)」の3種類があります。
この関係性のことを「カーディナリティ(多重度)」と呼び、ER図では線の端の記号によって表現されます。
リレーションの3種類まとめ
・1対1(1:1) → 一方の1件に対して、もう一方も必ず1件対応する
・1対多(1:N) → 一方の1件に対して、もう一方は複数件対応する
・多対多(M:N) → 両方のエンティティが互いに複数件対応する
どのリレーションを設定するかは、業務上のルールやデータの実態に基づいて決定します。
正しいリレーションを設定しないと、データの整合性が保てなくなる可能性があるでしょう。

1対1(1:1)リレーションとは
1対1のリレーションとは、一方のエンティティの1件に対して、もう一方のエンティティも必ず1件だけ対応する関係です。
たとえば「社員」と「社員証」の関係が典型的な例といえます。
1人の社員に対して1枚の社員証が発行され、1枚の社員証は1人の社員にしか紐づきません。
1対1のリレーションは比較的まれな関係で、セキュリティ上の理由や管理上の都合でテーブルを分けるときに使われることが多いでしょう。
1対多(1:N)リレーションとは
1対多のリレーションとは、一方のエンティティの1件に対して、もう一方のエンティティが複数件対応する関係です。
データベース設計で最もよく登場するリレーションであり、「1対多」を正しく理解することがER図習得の核心といえます。
代表的な例として、「1人の顧客が複数の注文をする」「1つの部署に複数の社員が所属する」などが挙げられます。
1対多のリレーションでは、「多」側のテーブルに「1」側のテーブルの主キーを外部キー(FK)として持たせる設計になります。
多対多(M:N)リレーションとは
多対多のリレーションとは、両方のエンティティが互いに複数件の関係を持つパターンです。
「1つの注文に複数の商品が含まれ、1つの商品は複数の注文に含まれる」という関係が典型的な例です。
多対多のリレーションは、そのままデータベースで実現できないため、中間テーブルを作成して解消するのが一般的です。
この中間テーブルを「関連テーブル」や「ブリッジテーブル」と呼ぶこともあります。
カーディナリティと多重度の表現方法
続いては、カーディナリティ(多重度)の具体的な表現方法を確認していきましょう。
カーディナリティはER図の読み取りにおいて最も重要な要素のひとつです。
IE記法でのカーディナリティ表現
IE記法ではリレーションの線の端に記号を組み合わせてカーディナリティを表現します。
記号の読み方は「エンティティに近い側の記号から読む」のが基本です。
| 記号の組み合わせ | 意味 | 読み方の例 |
|---|---|---|
| ||(縦線2本) | 必ず1件(1のみ) | 必ず1件対応する |
| ○|(丸+縦線) | 0または1件 | 対応しないこともある |
| |≪(縦線+鳥足) | 1件以上(必ず多) | 必ず1件以上存在する |
| ○≪(丸+鳥足) | 0件以上(0または多) | 0件でも複数件でもよい |
実際のER図では、左右それぞれの端に記号が付くため、両端を合わせて読むことでリレーションの全体像が把握できます。
UML記法での多重度表現
UML記法では数値やアスタリスク(*)を使って多重度を表現します。
「0..1」は「0件または1件」、「1..*」は「1件以上」を意味します。
UML記法は数値で明確に件数の範囲を示せるため、複雑な条件を表現する場合に便利です。
どちらの記法を使うかはツールやチームの慣習によりますが、記法を統一して使うことが大切でしょう。
||
○≪
最小・最大カーディナリティの考え方
カーディナリティには「最小値」と「最大値」の2つの観点があります。
最小カーディナリティは「最低何件存在するか(0か1か)」を示し、最大カーディナリティは「最大何件存在するか(1か多か)」を示します。
たとえば「0..1」であれば「最小0件・最大1件」、「1..*」であれば「最小1件・最大多件」という意味になります。
この2軸を意識することで、より正確にリレーションの制約を表現できるでしょう。
多対多を中間テーブルで解消する方法と外部キー・複合キーの役割
続いては、多対多リレーションの解消方法と、外部キー・複合キーの役割について確認していきましょう。
多対多はそのままデータベースに実装できないため、設計上の工夫が必要です。
中間テーブルで多対多を解消する
多対多のリレーションを解消するには、2つのエンティティの間に「中間テーブル」を挿入します。
「商品」と「注文」の多対多関係であれば、「注文明細」という中間テーブルを作成することで解消できます。
多対多の解消例
変更前:商品(多)←→(多)注文
変更後:商品(1)← 注文明細(多)→(1)注文
中間テーブル「注文明細」には「商品ID(FK)」と「注文ID(FK)」の両方を持たせる
中間テーブルを挿入することで、多対多が「1対多」と「多対1」の組み合わせに変換され、データベースで正しく実装できるようになります。
1
≫
≪
1
外部キー(FK)がリレーションを実現する仕組み
外部キーとは、別のテーブルの主キーを参照するための列です。
中間テーブルには両エンティティの主キーを外部キーとして持たせることで、データのつながりを管理します。
外部キーを設定することで、参照先に存在しないIDを登録しようとするとエラーになる「参照整合性」が働くようになります。
これによりデータの一貫性と整合性が自動的に守られる仕組みです。
複合キーとは何か
複合キーとは、複数の列を組み合わせて主キーとして扱う設計手法です。
中間テーブルでは「注文ID+商品ID」の組み合わせで1レコードを一意に識別することが多く、これが複合キーにあたります。
単独の列では一意性を保てない場合に、複数列の組み合わせで主キーを構成するのが複合キーの基本的な使い方です。
| キーの種類 | 説明 | 使う場面 |
|---|---|---|
| 主キー(PK) | レコードを一意に識別する列 | すべてのテーブルに設定する |
| 外部キー(FK) | 他テーブルの主キーを参照する列 | リレーションがあるテーブルに設定する |
| 複合キー | 複数列の組み合わせで主キーとする | 中間テーブルなどで使用する |
1対多・多対多の具体的な設計例
続いては、実際のシステムを想定した設計例で1対多・多対多のリレーションを確認していきましょう。
具体的なイメージを持つことで、より実践的な理解につながります。
ECサイトのデータベース設計例
ECサイトのデータベースを例に、各リレーションがどのように登場するかを見てみましょう。
「顧客」「注文」「商品」「注文明細」という4つのエンティティを使った設計が典型的なパターンです。
ECサイトのリレーション例
・顧客 1対多 注文 → 1人の顧客は複数の注文をする
・注文 多対多 商品 → 中間テーブル「注文明細」で解消
・注文 1対多 注文明細 → 1件の注文に複数の明細行がある
・商品 1対多 注文明細 → 1つの商品が複数の明細に含まれる
|
≪
|
≪
≫
|
社員管理システムの設計例
社員管理システムの場合、「部署」と「社員」は1対多の関係になります。
「1つの部署に複数の社員が所属し、1人の社員は必ず1つの部署に属する」というルールをER図で表現するのが基本パターンです。
一方、「社員」と「プロジェクト」の関係は多対多になることが多く、「アサイン」などの中間テーブルを使って解消する設計が一般的でしょう。
リレーション設計のよくある間違い
リレーション設計でよく起きる間違いとして、「多対多のまま実装しようとする」「外部キーをどちらのテーブルに持たせるか迷う」などが挙げられます。
外部キーは必ず「多」側のテーブルに持たせるのが基本ルールです。
「1対多」であれば「多」側のテーブルに「1」側の主キーを外部キーとして追加する、という原則を覚えておけば迷わずに済むでしょう。
まとめ
この記事では、ER図における1対1・1対多・多対多のリレーションの意味と、カーディナリティ・外部キー・複合キーの役割について解説しました。
リレーションには「1対1」「1対多」「多対多」の3種類があり、それぞれIE記法の記号で表現します。
多対多のリレーションはそのままでは実装できないため、中間テーブルを挿入して「1対多×2」に変換するのが基本の設計手法です。
外部キーは「多」側のテーブルに持たせ、複合キーは中間テーブルなど複数列で一意性を保ちたい場合に使います。
リレーションの種類を正しく理解することで、設計ミスの少ない堅牢なデータベース構築につながるでしょう。