関係データベースのドメイン・キー正規形を扱う
ドメイン・キー正規形は定義域とキーだけで制約を表す
関係データベースの正規化で、第五正規形の次に置く段階がドメイン・キー正規形 (Domain/Key Normal Form, DKNF) である。
5NF では、結合従属は候補キーから導ける。それでも、列の取りうる値の範囲や、列どうしの条件など、キーだけでは書けない制約が残ることがある。DKNF は、表に課すどの制約も、定義域の制約とキーの制約だけから導ける状態である。
部品表の種別と材質の条件を分ける
第五正規形の部品表では、行を区別する候補キーは 部品 だけである。種別が締結と緩衝のどちらかである、といった定義域の制約は、キーだけでは表せない。それでも定義域の制約として書けるので、次の表は DKNF である。
| 部品 | 種別 |
|---|---|
| ねじ | 締結 |
| 座金 | 締結 |
| 栓 | 緩衝 |
次の拡張では、種別が締結なら材質は金属である、という条件がある。材質の定義域は金属とゴムのどちらも含む。この条件は定義域でもキーでもない。この表は 5NF だが DKNF ではない。
| 部品 | 種別 | 材質 |
|---|---|---|
| ねじ | 締結 | 金属 |
| 座金 | 締結 | 金属 |
| 栓 | 緩衝 | ゴム |
許す種別と材質の組だけを種別材質の表へ移す。部品は、その組を指すように書く。
種別材質の表では、種別 と 材質 の組で行が1つに決まる。締結とゴムの組は置かない。
| 種別 | 材質 |
|---|---|
| 締結 | 金属 |
| 緩衝 | ゴム |
部品の表では、部品 が分かれば種別と材質が1つに決まる。(種別, 材質) は種別材質の表の候補キーを指す。
| 部品 | 種別 | 材質 |
|---|---|---|
| ねじ | 締結 | 金属 |
| 座金 | 締結 | 金属 |
| 栓 | 緩衝 | ゴム |
2つの表を 種別 と 材質 でつなぐと、分ける前の行に戻る。ねじは種別が締結で、材質が金属になる。締結とゴムの組は種別材質の表にないので、部品の表へ書けない。
ドメイン・キー正規形は定義域とキーへ落とせる制約まで整える
表を分けると、値の直し方と追加の仕方が単純になる。
- 締結に許す材質を直すときは、種別材質の表の1行を直せばよい。締結の部品の数だけ行を直す必要はない。
- まだ部品と結びついていない種別と材質の組も、種別材質の表へ追加できる。
- ある部品の行を消しても、種別と材質の組は種別材質の表に残る。
ここまでの表では、部品の表の候補キーは 部品 である。種別材質の表の候補キーは (種別, 材質) である。種別が締結と緩衝のどちらかである、材質が金属とゴムのどちらかである、といった条件は定義域の制約として書ける。
種別が締結なら材質は金属である、という条件は、種別材質の表のキーと、部品の表からの参照で表せる。定義域とキー以外の制約は残らないので、これらの表は DKNF である。
ドメイン・キー正規形が整えるのは、表の制約を定義域とキーだけから導けるところまでである。実務では、すべての制約をそこまで落とせるとは限らない。落とせない制約は、表の外の検査や手続きに残す。