2020-07-12 (Sun.)
\(\def\null{\mathrm{null}}\def\A{\mathcal{A}}\def\D{\mathcal{D}}\def\dom{\mathrm{dom}}\def\Bool{\mathrm{Bool}}\) \(\def\mvdarrow{\rightarrow\!\!\!\rightarrow}\def\fdarrow{\rightarrow}\) \(\def\ID{\mathrm{ID}}\)
Relatinal Database で第一正規形 (1NF) を定義したが実はこれだけでは実用的ではない. より高次の正規形を定義する.
これを第二正規形という. ここで非キー属性とはいかなる候補キーにも属さない属性(一個からなる名前列)のこと.
1NF であって 2NF ではない | ID1 | ID2 | val |
---|---|---|---|
1 | 1 | x | |
1 | 2 | y | |
1 | 3 | y | |
2 | 1 | x |
これで候補キーは (ID1, ID2) のみ. val を含んだ候補キーはありえないので val は非キー属性 (non-prime attribute). ここで 2NF の要請は val が (ID1, ID2) に完全関数従属することだが, その真の部分列 (ID2) に完全関数従属しているので要請を満たさない.
この関係は \(R_1(\ID_1, \ID_2), R_2(\ID_2, val)\) に完全情報無損失分解できて, 2NF になる.
このときに
であることを推移的関数従属性という. \(Z\) は推移的に \(X\) に関数従属する, という.
2NF であって 3NF ではない | ID | x | y |
---|---|---|---|
1 | 1 | a | |
2 | 1 | a | |
3 | 2 | b | |
4 | 2 | b |
候補キーは (ID) のみ. (x) 及び (y) は (ID) に完全関数従属しているのでこれは確かに 2NF.
ところで (y) は (x) に関数従属していて,
なので (x) は候補キー (ID) に推移的に関数従属している. 従って 3NF ではない.
今の例は \(R_1(\ID, x)\) と \(R_2(x, y)\) に(完全情報無損失)分解することで 3NF になる.
関係 \(R\) について, 関数従属性 \(X \fdarrow Y\) を持つならば次の二つのいずれかが成り立つこと:
このときの \(R\) を BNF という.
3NF であって BNF ではない | ID1 | ID2 | val |
---|---|---|---|
1 | 1 | a | |
1 | 2 | a | |
2 | 1 | b | |
2 | 2 | c |
(ID1, ID2) は候補キーだが同時に (ID2, val) も候補キーである. というわけでこの関係に非キー属性はなく, 自動的に第二正規形でかつ第三正規形になる.
ところで関数従属性として \(val \fdarrow \ID_1\) がある. (val) だけでは候補キーにはなりえないので, これは BNF ではないことが確認できる.
ここまで関数従属性を使ってきたけど, BNF の多値従属性バージョンを第四正規形という.
\(R\) の任意の多値従属性 \(X \mvdarrow Y\) が次のいずれか
このとき \(R\) は 4NF だという.
前回 の一番最後では多値従属性をさらに拡張した結合従属性を紹介した. 4NF の多値従属性を結合従属性に置き換えるのが 5NF. これは射影-結合正規形 (Project-Join Normal Form; PJNF) などとも呼ばれる.
\(R\) の任意の結合従属性 \(\ast(A_1, \ldots, A_n)\) について,