TL

関数従属性と正規形の理論(BCNF・4NF・5NF)

なぜそのテーブル分割が正しいのかを勘ではなく証明で示せるようになる。関数従属性とアームストロング公理から無損失結合分解を導き、BCNFと第4・第5正規形までの数理的根拠を整理する。

応用データベース設計正規化RDB理論最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.正規形は関数従属性の集合に対する制約条件であり、アームストロング公理で導かれる属性閉包から機械的に判定できる。
  • 2.BCNFは「すべての非自明な関数従属の左辺がスーパーキー」を要求し、3NFより強いが従属性保存を諦める場合がある。
  • 3.4NFは多値従属、5NFは結合従属を扱い、無損失結合かつ偽タプルを生まない分解を保証する。

関数従属性:正規形を測る物差し

正規化を「経験則の段階表」として暗記すると、なぜその分割が正しいのかを説明できません。理論の出発点は**関数従属性(FD: Functional Dependency)**です。属性集合 X と Y について、X の値が決まれば Y の値が一意に定まるとき X → Y と書き、「X が Y を関数的に決定する」と言います。

FD はデータの一時的な状態ではなく、ドメインが課す意味的な制約です。たとえば 社員ID → 部署名 は「同じ社員IDの行は必ず同じ部署名を持つ」という業務ルールであり、これに反する状態は不正データとみなされます。正規形とは結局のところ、与えられた FD 集合 F に対してスキーマが満たすべき条件にすぎません。

正規化で扱う 2NF・3NF も、厳密にはこの FD の言葉で定義されます。2NF は「候補キーの一部分への部分従属の排除」、3NF は「キー以外の属性経由の推移従属の排除」です。

アームストロング公理と属性閉包

FD 集合 F から論理的に導けるすべての FD の集合を閉包 F+ と呼びます。これを生成する健全かつ完全な推論規則がアームストロング公理です。

公理規則内容
反射律Y ⊆ X ならば X → Y自明な従属(部分集合は常に決まる)
増加律X → Y ならば XZ → YZ両辺に同じ属性を足してよい
推移律X → Y かつ Y → Z ならば X → Z従属を芋づる式につなげる

ここから合併律(X → YX → ZX → YZ)や分解律などの便利な系が導けます。健全(導けるものは必ず成り立つ)かつ完全(成り立つものは必ず導ける)なので、この3公理だけで F+ を尽くせます。

ただし F+ 全体を列挙するのは指数的で非現実的です。実務で使うのは属性閉包 X+(X から到達できる属性の集合)です。X → YF+ に属するか否かは、Y ⊆ X+ かどうかで多項式時間で判定できます。

属性閉包 X+ の計算(各 FD を最大1回適用するまで反復)
  closure = X
  repeat:
    for each (A → B) in F:
      if A ⊆ closure: closure = closure ∪ B
  until 変化なし
  return closure

この X+ がスキーマの全属性を含むなら、X はその関係のスーパーキーです。さらに X のどの真部分集合もスーパーキーでないなら X は候補キー。正規形の判定は、すべて「左辺の閉包がキーを含むか」という閉包計算に帰着します。

無損失結合分解:分けても情報を失わない条件

テーブルを分割する以上、JOIN で元に戻せなければ意味がありません。分解 R を R1, R2 に分けたとき、R1 ⋈ R2 が常に元の R に一致する(偽の行が増えない)分解を**無損失結合分解(lossless-join)**と呼びます。

二分解の判定条件は明快です。共通属性が少なくとも一方のキーになっていればよい、つまり次のいずれかが F+ にあれば無損失です。

(R1 ∩ R2) → R1   または   (R1 ∩ R2) → R2

直感的には、共通列が片側の関係を完全に決定するなら、JOIN 時に1対多で正しく対応づけられ、無関係な行同士が結びつく「偽タプル」が生じません。逆にこの条件を欠く分解は、JOIN で元データに存在しなかった組み合わせを生成してしまいます。

無損失と従属性保存は別物

良い分解には無損失結合に加え、各 FD が分解後のどれか1つの関係内で検査できる**従属性保存(dependency-preserving)**も望まれます。従属性が保存されないと、その制約をチェックするのに JOIN が必要になり、更新時のコストと実装難度が上がります。後述のとおり BCNF では両立できないことがあります。

BCNF:左辺はすべてスーパーキー

**ボイス・コッド正規形(BCNF)**の定義は1行です。関係 R のすべての非自明な FD X → Y について、X がスーパーキーであること。3NF が「右辺がキーの構成属性(素属性)なら例外的に許す」という緩和を持つのに対し、BCNF はこの逃げ道を塞いだ厳格版です。

3NF と差が出るのは、複数の重なり合う候補キーがある場合です。古典例として (学生, 科目) → 教員教員 → 科目(各教員は1科目だけ担当)という関係を考えます。候補キーは (学生,科目)(学生,教員)教員 → 科目 の左辺 教員 はスーパーキーではないため BCNF 違反ですが、科目 は素属性なので 3NF は満たします。

観点3NFBCNF
左辺の条件スーパーキー、または右辺が素属性常にスーパーキー
無損失分解常に可能常に可能
従属性保存常に可能保証されない
残る冗長性重複キー絡みで残ることがあるFD 由来の冗長は基本的に解消

この例を BCNF へ分解すると {教員, 科目}{学生, 教員} に分かれますが、(学生,科目) → 教員 がどちらの関係にも収まらず保存されません。つまり BCNF は冗長を完全に消す代わりに従属性保存を犠牲にしうる、というトレードオフを持ちます。実務では「BCNF を取るか、3NF に留めて従属性保存を守るか」を制約の検査コストで判断します。

4NF:多値従属を断つ

FD だけでは捉えられない冗長があります。1つの属性が、互いに独立な複数の多値属性を持つ場合です。社員が複数のスキルと複数の資格を独立に持つとき、これらを1つの関係 {社員, スキル, 資格} に入れると、スキル数×資格数の直積行が生じます。

これを記述するのが多値従属性(MVD) X ↠ Y で、「X を固定したとき Y の集合が他の属性と独立に決まる」を意味します。**第4正規形(4NF)**は、すべての非自明な MVD X ↠ Y で X がスーパーキーであることを要求します。先の関係は 社員 ↠ スキル の左辺がキーでないため違反で、{社員, スキル}{社員, 資格} に分解すべきです。すべての FD は MVD の特殊形(X → Y ならば X ↠ Y)なので、4NF を満たせば自動的に BCNF も満たし、4NF は BCNF を内包します。

5NF:結合従属と偽タプル

最後の段が**第5正規形(5NF、PJ/NF とも)です。ここで扱うのは結合従属性(JD: Join Dependency)**で、関係が3つ以上の射影に無損失分解できる、より一般的な状況を指します。二分解では無損失にできないのに、三分解なら復元できるケースが存在します。

典型は {業者, 部品, 案件} の3項関係に「業者が部品を扱い、案件が部品を要し、業者が案件に関わるなら、その業者はその案件にその部品を供給する」という巡回ルールが成り立つ場合です。このとき関係は3つの2項射影 {業者,部品}{部品,案件}{業者,案件} に無損失分解でき、どの2つの JOIN でも復元できないが3つすべての JOIN で正しく戻ります。

5NF の判定基準

5NF は「すべての結合従属が候補キーから含意される(キーに基づく JD のみが成り立つ)」状態です。これ以上分解しても情報は増減せず、かつ偽タプルも生じません。MVD は2項の JD の特殊形なので、5NF は 4NF を内包し、正規形の最も強い段に位置づけられます。

JD は実在のビジネスルールとしては稀で、5NF が問題になる設計は多くありません。しかし「無損失性は二分解の枠を超えて定義される」という理解は、多対多を結ぶ中間テーブルの設計判断で効いてきます。

包含関係と実務上の落としどころ

正規形は 1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF ⊃ 5NF という入れ子で、上位は下位を必ず満たします。各段は「左辺がキーであること」を、扱う従属性の種類(FD → MVD → JD)へ順に拡張したものだと見ると一貫します。

正規形対象の従属性中核の条件
3NF関数従属(FD)左辺がスーパーキー or 右辺が素属性
BCNF関数従属(FD)左辺が常にスーパーキー
4NF多値従属(MVD)非自明な MVD の左辺がスーパーキー
5NF結合従属(JD)JD がすべてキーから含意される

実務の到達目標は依然として 3NF または BCNF です。多くの設計はここで冗長と異常をほぼ排除でき、4NF・5NF が問題になるのは独立な多値属性や巡回的な多対多を1表に詰めた設計に限られます。重要なのは段階表の暗記ではなく、FD/MVD/JD を明示し、属性閉包で判定するという手順で「なぜこの分割か」を証明できることです。この数理的根拠こそが、勘に頼らない正規化と、必要十分なインデックス設計の土台になります。

データベース Article

関数従属性と正規形の理論(BCNF・4NF・5NF)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

データベース

比較で見る軸

難易度: advanced / カテゴリ: データベース / タグ数: 5

導入後に効く点

BCNFは「すべての非自明な関数従属の左辺がスーパーキー」を要求し、3NFより強いが従属性保存を諦める場合がある。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
データベース
タグ数
5

判断チェックリスト

  • 自社の用途が「データベース / 設計」に近いか確認する。
  • 強みである「正規形は関数従属性の集合に対する制約条件であり、アームストロング公理で導かれる属性閉包から機械的に判定できる。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

データベース設計正規化RDB理論データベース設計正規化