関係データベースの第四正規形を扱う
第四正規形は独立した繰返しを分ける
関係データベースの正規化で、ボイス・コッド正規形の次に置く段階が第四正規形 (Fourth Normal Form, 4NF) である。
BCNF では、関数従属について、決める側が候補キーである。それでも、1つのキーに対して独立に繰返す組が残ることがある。第四正規形は、その独立した繰返しを別の表へ移す。
ある列の組が決まると、別の列の組の値の集合が、その他の列と無関係に繰返すとき、その関係を多値従属と呼ぶ。第四正規形は、どの非自明な多値従属でも、決める側が候補キーである状態である。
履修表の科目と部活を別の表へ移す
ボイス・コッド正規形の履修表では、1人の学生が複数の科目を履修し、複数の部活に所属する。科目と部活に直接の決まりはない。行を区別する候補キーは (学生, 科目, 部活) だけである。
| 学生 | 科目 | 部活 |
|---|---|---|
| 太郎 | 数学 | 野球 |
| 太郎 | 数学 | 音楽 |
| 太郎 | 英語 | 野球 |
| 太郎 | 英語 | 音楽 |
学生が分かれば、科目の集合と部活の集合がそれぞれ決まる。科目の繰返しと部活の繰返しは独立である。学生が科目の集合を決め、学生が部活の集合を決める。どちらの多値従属でも、決める側の学生だけでは行を区別できない。この表は BCNF だが 4NF ではない。
科目の繰返しは履修の表へ移す。部活の繰返しは所属の表へ移す。
履修の表では、学生 と 科目 の組で行が1つに決まる。
| 学生 | 科目 |
|---|---|
| 太郎 | 数学 |
| 太郎 | 英語 |
所属の表では、学生 と 部活 の組で行が1つに決まる。
| 学生 | 部活 |
|---|---|
| 太郎 | 野球 |
| 太郎 | 音楽 |
2つの表を 学生 でつなぐと、分ける前の行に戻る。太郎の数学は、野球と音楽の両方と組になる。
第四正規形でも結合にだけ現れる制約は残る
表を分けると、値の直し方と追加の仕方が単純になる。
- 科目を消すときは、履修の表の1行を消せばよい。部活の数だけ行を消す必要はない。
- まだ部活に入っていない学生の科目も、履修の表へ追加できる。
- ある学生の部活をすべて消しても、科目は履修の表に残る。
ここまでの表では、多値従属の決める側は候補キーである。それでも、3つの列の組について、どの2列の組も事実として成り立つなら3列の組も必ず成り立つ、という制約が残ることがある。次の取次表は 4NF である。
| 担当 | メーカー | 部品 |
|---|---|---|
| 山田 | 東工 | ねじ |
| 山田 | 東工 | 座金 |
| 山田 | 西工 | ねじ |
| 鈴木 | 東工 | ねじ |
担当とメーカー、メーカーと部品、担当と部品のどの2列の組も事実なら、3列の組もこの表になければならない。行を区別する候補キーは (担当, メーカー, 部品) だけである。非自明な多値従属の決める側は候補キーなので、この表は 4NF である。
山田は東工と西工を担当し、東工のねじと座金、西工のねじを扱う。西工の座金はまだ無い。担当・メーカー・部品の対応を3つの2列表へ分けてつなぐと、山田・西工・座金の行が余分に現れることがある。
この結合にだけ現れる制約は、第五正規形で分ける対象になる。第四正規形が整えるのは、多値従属について、決める側が候補キーであるところまでである。