正規化
作成日時:2024-08-25
更新日時:2024-08-26
挿入時、更新時、削除時異常を防ぐ。
結合は遅いので、更新少ないやつとかはあえて正規化しないのもあり。
正規形
第1正規形
下記の条件を満たす場合。
リレーションR(A1, A2, A3...)
は、その各ドメインdom(Ai) (i=1...n)
がシンプルである
- ドメイン:異なる元の集合(set)。
- 元:集合の中の要素
- ドメインがシンプル
- 直積だったりべき集合(部分集合)が存在しない
- 属性が全て単一値を取る
- 繰り返し項目が無い、カラムの中にリレーションが存在しないこと。
- 存在する場合は、非第1正規形または入れ子型リレーションという。
{受注, 受注明細[明細1, 明細2...]}
は明細が冪集合なので非第1正規形
第2正規形
下記の条件を満たす場合。
- Rは第1正規形である
- Rの全ての非キー属性はRの各候補キーに完全関数従属していること
部分関数従属する非キーがあってはならない
第3正規形
下記の条件を満たす場合。
- Rは第2正規形である
- Rの全ての非キー属性はRのいかなる候補キーにも推移的に関数従属しない
ボイス・コッド正規形
下記のいずれかを満たす場合。
1.X -> Yは自明な関数従属である。
2.XはRのスーパーキーである
- 自明な関数従属
- ニュアンスは違うが、YがXの部分集合。
- スーパーキー
- 候補キーを含む属性集合
- 候補キーが非キーに関数従属しているとかはボイス・コッド正規形ではない
- 情報無損失分解ではあるが関数従属性保存ではない。
- 第3正規形にとどめて、アプリで更新異常を防ぐが。
- BCNFにして、アプリで元の関数従属性をチェックするか。
第4正規形
下記のいずれかを満たす場合。
- X->->Yは自明な多値従属性である
- XはRのスーパーキーである
第5正規形
下記のいずれかを満たす場合。
*(X1, X2, X3..., Xi)*
は自明な結合従属性である- 各XiはRのスーパーキーである
- 自明な結合従属性
X1, X2...
のひとつがRそのもの- つまり元の表がそのままいる
- 結合従属性保存ではない
- 自然結合すると分解前に存在しなかったタプルが存在する
第6正規形
下記を満たす場合。
Rに保持される唯一の結合従属性が自明なものである場合に限り、第6正規形 (6NF)
- もう分解できない状態
- 本当化は知らないが、ビッグデータの分析で使うとか。
- カラムナフォーマット的な感じで
- dateさんが提唱
基本的に第3正規形は第5正規形まで成立している
商品マスタ{商品ID(PK), 商品名}
上記リレーションは第3正規形まで分解した結果。商品ID→→商品名(要素1つだけの集合)|Φ
ととれるため
このリレーションは第4正規形を満たしていると言える。商品マスタ{商品ID(PK), 商品名, 料金}
とかならば、自明ではないが、商品IDがスーパーキーだから第4正規形。
また、自明な結合従属性を持つため、第5正規形を満たしていると言える。
(更にいうなら第6正規形も)
多値従属性
Rを関係とし、A, B, Cを、Rの属性集合の任意の部分集合とする。
Rのある(A値、C値)対に対応するB値の集合がA値だけに依存し、C値には独立かつそのときに限り、
BはAに多値従属しているといい、次のように表す。A→→B
もしくは、
リレーションRの任意の集合ABCにおいて、その射影AB,ACに情報無損失分解できる場合
Rには多値従属性が存在するといえる。
簡単に言えば、ある項目が決まれば複数の集合が決定されるやつ。
スーパーキーを考えると面倒になるので、いったん忘れる。
自明な多値従属性
A→→B|Φ(空集合)
であるとき- 簡単に言えば、多値従属性が1個の場合
- BがAの部分集合であるとき