SQLシリーズ
データベース学習その1 データベース入門: https://blog.yexca.net/archives/86
データベース学習その2 リレーショナルモデル: https://blog.yexca.net/archives/87
データベース学習その3 SQL言語: https://blog.yexca.net/archives/88
データベース学習その4 リレーショナルデータベース理論: https://blog.yexca.net/archives/89
データベース学習その5 範式: この記事
データベース学習その6 データベース設計: https://blog.yexca.net/archives/91
データベース学習その7 データベースの制御機能: https://blog.yexca.net/archives/92
リレーショナルデータベースにおけるリレーションは、一定の正規化要件を満たす必要があるよ。異なる正規化の程度は、範式(ノーマルフォーム)で測ることができるんだ。現在、主に6種類の範式があるよ:1NF、2NF、3NF、BCNF、4NF、5NF。
最低限の要件を満たすものを1NFと呼び、1NFをベースにさらにいくつかの要件を満たすものが2NF、といった具合だね。これらの範式の中で、最も重要なのは3NFとBCNFで、これらが正規化を行う上での主要な目標になるよ。
より低い範式のリレーションスキーマは、スキーマ分解によって、いくつかのより高い範式のリレーションスキーマの集合に変換できるんだ。このプロセスを正規化と呼ぶよ。
第一正規形 (1NF)
定義:Rをリレーションスキーマとするね。Rが第一正規形に属するのは、R内のすべての属性Aの値域が原子項、つまり分割不可能なデータ項目のみを含む場合、かつその場合に限るよ。
1NFでは、データの冗長性、更新(挿入、削除)異常、変更の複雑さといった問題を排除できないんだ。なぜなら、部分関数従属が存在する可能性があるからね。
第二正規形 (2NF)
定義:Rをリレーションスキーマとするね。Rが第二正規形に属するのは、Rが1NFであり、かつすべての非主キー属性が候補キーに完全関数従属している場合、かつその場合に限るよ。
2NFに属するリレーションスキーマRでも、データの冗長性や更新異常といった問題が発生する可能性があるんだ。なぜなら、推移的関数従属が存在する可能性があるからね。
第三正規形 (3NF)
定義:Rをリレーションスキーマとするね。Rが第三正規形に属するのは、Rが2NFであり、かつすべての非主キー属性が候補キーに非推移的従属している場合、かつその場合に限るよ。
3NFに属するリレーションスキーマRでは、主キー属性がキーに対して部分従属したり、推移的従属したりする可能性があるんだ。
BC正規形 (BCNF)
定義:Rをリレーションスキーマ、Fをその従属関係の集合とするね。RがBCNFに属するのは、Rが3NFであり、かつF内の各従属関係の決定因子が必ずRのいずれかの候補キーを含む場合、かつその場合に限るよ。
BCNFの定義から、BCNFを満たすリレーションスキーマには以下の特徴があることがわかるよ:
- すべての非主キー属性が、各キーに対して完全関数従属している
- すべての主キー属性が、自分自身を含まない各キーに対しても完全関数従属している
- いかなる属性も、非キーのいかなる属性集合に対しても完全関数従属していない
BCNFを満たすリレーションスキーマRは、挿入異常と削除異常をすでに解消しているんだ。
2つの属性しかないリレーションスキーマは、必ずBCNFだよ
第四正規形 (4NF)
定義:リレーションスキーマ R<U, F> が1NFであるとするね。もしRの各非自明な多値従属 X →→ Y (Y ⊈ X) について、XがRのいずれかの候補キーを含んでいる場合、Rは第四正規形であると言うよ。
- 多値従属
与えられたリレーションスキーマ R<U, F> において、X、Y、ZがUの部分集合で、かつZ = U - X - Yとするね。リレーションスキーマRにおける多値従属 X →→ Y が成立するのは、Rの任意のリレーションrに対して、(x, z) の値のペアが与えられたとき、Yの値の集合が存在し、その集合がxの値のみによって決定され、zの値とは無関係である場合、かつその場合に限るよ。
- 自明な多値従属
もし上記の多値従属の定義において X →→ Y が成立し、かつZが空集合である場合、X →→ Y を自明な多値従属と呼ぶよ。
正規形まとめ
- 1NF(第一正規形)
すべてのフィールド値が分割不可能な原子値であること
- 2NF(第二正規形)
非主キー属性がキーに対して部分関数従属を含まないこと。一つのテーブルには一つの種類のデータしか保存できず、複数の種類のデータを同じデータベーステーブルに保存してはいけないよ。
- 3NF(第三正規形)
非主キー属性がキーに対して推移的関数従属を含まないこと。データテーブルの各列データが主キーに直接関連していることを保証し、間接的には関連しないようにするんだ。
- BCNF(BC正規形)
各属性の候補キーに対する推移的従属を解消すること。BCNFは修正された3NFだよ。
1NF → 2NF:非主キー属性のキーに対する部分関数従属を解消する
2NF → 3NF:非主キー属性のキーに対する推移的関数従属を解消する
3NF → BCNF:主キー属性のキーに対する部分関数従属と推移的関数従属を解消する
BCNF → 4NF:非自明かつ非関数従属の多値従属を解消する
候補キーが単一属性の場合、少なくとも2NFだよ
リレーションスキーマの分解
データ冗長性、挿入異常、削除異常の問題があるリレーションスキーマに対しては、一つのリレーションスキーマを複数のリレーションスキーマに分解する方法で処理するべきだよ。それに応じて、元々一つの2次元テーブルに格納されていたデータは、複数の2次元テーブルに分散されることになるね。この分解が意味を持つためには、少なくとも後者が前者の情報を失わないことが最低限の要件となるんだ。
分解処理ではいくつかの新しい問題が出てくることがあるよ。分解後のスキーマが元のスキーマが満たしていた特性を維持するためには、スキーマ分解が無損失分解性と関数従属保存性を持っていることが基本的な要件なんだ。
無損失分解
無損失分解とは、リレーションスキーマを分解する際、元のリレーションスキーマ下の任意の有効なリレーションインスタンスが、分解後に自然結合演算によって復元できることを指すよ。
つまり、分解されたリレーションが自然結合によって元のリレーションに復元できるってことだね。
関数従属保存性
スキーマ分解後のF’(各サブスキーマの関数従属の和集合)がF(元の関数従属集合)と等価かどうか、F’がF中のすべての関数従属を含んでいれば、関数従属保存性があると言えるよ(十分条件)。
つまり分解後も従属関係は変わらないってこと。
参考: スキーマ分解における関数従属保存性の判断—データベース試験復習_guoyp2126のブログ-CSDNブログ
R (ABCDEGH), F={A->D, E->D, D->B, BC->D,DC->A} が与えられているね。関数従属を保存する3NF分解を求めてみるよ。
1)最小関数従属集合を求める
2)Fに含まれない属性をすべて見つけ出し、個別に分類する
3)各従属関係の左側が同じものを一組にまとめる。同じものがない場合は、A->Dを{AD}のように変更する。もし{A->B,A->C}のように同じものがあれば、{ABC}のようにするんだ。
4)候補キーが分離されたものの中に現れない場合、任意の候補キーを一つの分類とする。
最小関数従属集合Fmin={A->D, E->D, D->B, BC->D, DC->A}
GHはFに含まれていないから、{GH}として個別に分類するよ。
候補キー:CE
AE
{AD}{ED}{DB}{BCD}{DCA}{CE}{GH}