第三正規形(3NF)とは:データベース正規化の定義と判定基準

第三正規形(3NF)の定義と判定基準をわかりやすく解説。主キー依存や非キー列の削除で冗長性を排除し、安全で効率的なデータ設計を実践する方法を紹介。

著者: Leandro Alegsa

第3正規形(3NF)とは、関係モデル、特にテーブルの設計における正規化の基準の一つで、冗長性の低減と更新異常の回避を目的とします。

定義と本質

一般に第3正規形は、表がまず第二正規形(および第一正規形)であることを前提とし、さらに「推移的依存(transitive dependency)」が存在しないことを要求します。より形式的には、関係Rにおける任意の関数従属性 X → A について次のいずれかが成り立てばRは3NFである、と定義できます。

  • XがRのスーパーキー(行を一意に識別する列の組み合わせ)である。
  • Aが「素属性(prime attribute)」である(つまり、Aがいずれかの候補キーの一部である)。

ここで素属性とは、ある候補キー(最小のキー)の一部となる列を指します。逆に、どの候補キーにも含まれない列は非素属性(non-prime attribute)と呼ばれます。

判定の手順(チェックリスト)

  • まず表が第一正規形(列に原子値のみを持つ)であることを確認する。
  • 第二正規形(主キーが複合キーの場合に部分依存がない)を満たしていることを確認する。
  • 表内のすべての関数従属性 X → A を列挙する。
  • 各従属性について、Xがスーパーキーであるか、またはAが素属性であるかをチェックする。どちらにも当てはまらない従属性が存在すれば3NF違反である。

トランジティブ依存(例と解決)

典型的な違反例を示します。従属性が次のように存在する場合:

  • StudentID → DeptID
  • DeptID → DeptName

このとき StudentID → DeptName は推移的依存です(DeptName は StudentID の非キー属性 DeptID を介して決まる)。DeptName が候補キーの一部でない場合、3NFに違反します。解決策は Dept テーブルを分割して、DeptID、DeptName を別の表に移すことです。これにより DeptName の重複や更新異常を防げます。

BCNFとの違い

第3正規形は素属性に関する例外を許しますが、ボイス=コッド正規形(BCNF)はさらに厳しく、任意の関数従属性 X → A に対して常に X がスーパーキーであることを要求します。したがって、BCNF は 3NF より強い(制約が厳しい)正規形です。ただし実務では、3NF の方が候補キーに関する例外により実装上の利便性を保てる場合があります。

実務上の注意点

  • 利点:データの冗長性と更新・削除・挿入の異常を低減できる。
  • 欠点:正規化を進めすぎるとテーブル分割が増え、結合(JOIN)が多くなり性能に影響することがある。実運用ではパフォーマンスや運用性を考慮して部分的な非正規化(デノーマライズ)を行うことがある。
  • 判断基準:理論的には3NFを満たすことが望ましいが、システム要件(読み取り頻度、書き込み頻度、インデックス戦略、トランザクション要件など)に応じて最適な設計を選ぶ。

まとめ(ポイント)

  • 第3正規形は第1・第2正規形を満たした上で、非キー属性が主キーに対して推移的に依存しないことを要求する。
  • 形式的には「任意の X → A に対し、X がスーパーキーであるか、A が素属性である」ことが必要条件。
  • BCNF はこれより厳しく、すべての決定子がスーパーキーであることを要求する。
  • 実務では正規化と性能(結合コスト)のバランスを取りながら設計するのが現実的。

参考:主キーとは、テーブルの行を一意に識別し、インデックス等で利用される1つ以上の列の組み合わせを指します。不要な列(主キーと関連しない列や、推移的に決まる列)は分割して別表にすることで冗長性を減らします。



百科事典を検索する
AlegsaOnline.com - 2020 / 2025 - License CC3