参加制約 (必須参加 / 任意参加) とは
参加制約 (optionality) とは、ER モデルにおいて関連の各エンティティ側が関連に必ず参加するか (必須参加) 参加しないことも許されるか (任意参加) を規定する、最小基数についての制約である。
まず身近な例で: 「0 人の部署」と「配属前の新入社員」を認めるか
参加制約 (optionality) を理解する一番簡単な問いは、以下の 2 つ:
- この会社は、所属する社員が 0 人の部署(新設したばかりで人事異動を待っている部署)の存在を認めますか?
- この会社は、どの部署にもまだ所属していない新入社員(配属前の内定者)をシステムに登録できますか?
「0 個も許容する」= 任意参加、「必ず 1 個以上」= 必須参加。 つまり参加制約は「相手が最低 何個 必要か」の指定で、カーディナリティ が「最大基数」なら 参加制約は 最小基数。両方セットで初めて関連の意味が完成する。
ER 図での参加制約の記号
IE 記法 (crow's foot) では、線の端の記号で表す:
- 縦棒 (|) — 必ず 1 (必須参加)
- 円 (○) — 0 も許容 (任意参加)
部署側 = 縦棒 (必ず 1 部署に所属)、社員側 = 縦棒 + 鳥足 (部署は必ず 1 人以上の社員を持つ)。
両端の記号のうち「線側寄り」に ○ が含まれる (部署側は |○、社員側は ○ 鳥足)。この ○ が最小 0 を意味する。部署なしの内定者、社員 0 人の新設部署、どちらも許容する構造。
試してみる: 円 (○) と縦棒 (|) の切り替えで業務ルールがどう変わるか
カーディナリティ ページ と同じ 3 シナリオを、今度は 下限側の記号 (○ vs |) のみ 切り替えられる形で用意した。 上限側の記号 (鳥足の有無) は各シナリオの業務仕様に合わせて固定してある。 「0 個も許すのか、必ず 1 個以上必要か」の差が、現実世界のどのルールに直結しているかを試してほしい。
問 1: 顧客 と 注文
EC サイトの顧客と注文。上限は「1 顧客に複数注文 / 1 注文に 1 顧客」で固定してある (前ページで扱った軸)。ここで動かせるのは各側の「下限 = 0 個も許すか、必ず 1 個以上か」だけ。参加制約 (円 vs 縦棒) を切り替えて業務ルールがどう変わるかを試せる。
この図が現実世界で語っているルール — 各行、成立する (O) か成立しない (X) か答えよう
- 注文したことがない顧客も登録してよい未回答
- どの顧客にも紐付かない注文が登録できる未回答
問 2: 学生 と 履修科目
大学の履修モデル。上限は両側 N (多対多) で固定。動かせるのは「0 科目でも学生 OK か」「履修者 0 の科目を許すか」の下限だけ。
この図が現実世界で語っているルール — 各行、成立する (O) か成立しない (X) か答えよう
- 1 科目も履修していない学生が存在してよい未回答
- 履修者が 0 人の科目が存在してよい未回答
問 3: 社員 と 部署
会社の所属モデル。上限は「社員は 1 部署に所属」「部署に複数社員」で固定 (前ページで扱った軸)。動かせるのは「配属前の社員 OK か」「無人部署 OK か」の下限だけ。
この図が現実世界で語っているルール — 各行、成立する (O) か成立しない (X) か答えよう
- どこの部署にも所属していない社員 (配属前の内定者) を登録してよい未回答
- 所属社員が 0 人の部署 (新設直後) が存在してよい未回答
参加制約を DB 上で表現する: FK 制約
参加制約は ER モデル層 の設計仕様であって、そのままでは DB は何も強制してくれない。 これを実装層で担保する主な手段が FK 制約 (外部参照制約)。 FK 列の NOT NULL / NULL 許可 の使い分けで、参加制約を DB のスキーマに落とし込む:
- 必須参加 → FK 列を NOT NULL にする (相手を必ず持たせる)
- 任意参加 → FK 列を NULL 許可 にする (相手を持たない状態を許す)
ただし FK 制約が保証するのは「参照した先が存在すること」だけで、「必ず参照すること」まで踏み込まない。 任意参加は NULL 許可 だけで足りるが、必須参加を厳密に強制したければ NOT NULL + 挿入時トリガや業務ルールのバリデーションを追加する必要がある。 「参加制約 = 設計」「FK 制約 = 実装」と考え、後者は前者を DB に翻訳する道具、と押さえておくと混乱しない。
変なER図 との対応: 違和感 #9 参加制約の矛盾
変なER図 の「注文 —明細— 注文明細」の線を注意深く見ると、注文側 に |○ (最大 1、最小 0)、注文明細側 に 1..N (最大 N、最小 1) が並んでいる。 IE 記法として厳密に読むと:
- 注文明細側から: 「1 つの注文は明細を 1 件以上 必ず持つ」(必須参加)
- 注文側から: 「1 つの明細は親の注文を 0 or 1 個しか持たない」(任意参加、注文なしでも存在可)
この 2 つは 存在論的に両立しない。 「注文には明細が必ず 1 件以上ある」なら、その明細を逆から見れば必ず親の注文を持つ (= 最小 1) はず。 参加制約は片側だけで決まらず、両側の最小基数が整合していないと関連そのものが破綻する。
さらにこの線は 識別関係(弱エンティティを親に繋ぐ関連) なので、 「弱エンティティは親なしでは存在できない」という定義と親側 min=0 が真っ向から衝突する。 参加制約の矛盾は、関連の意味と組み合わさると設計そのものを崩壊させる。
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)