ドメインキー正規形( DK/NFまたはDKNF ) は、データベース正規化で使用される正規形であり、データベースにはドメイン制約とキー制約 以外の制約が含まれていないことを要求します。
ドメイン制約は特定の属性に許容される値を指定しますが、キー制約は特定のテーブル内の行を一意に識別する属性を指定します。
ドメイン/キー正規形は、関係におけるすべての制約がキーとドメインの定義の論理的帰結であり、キーとドメインの制約と条件を適用することですべての制約が満たされる場合に実現されます。したがって、この正規形はすべての非時間的異常を回避します。
ドメイン/キー正規形を使用する理由は、データベース内に明確なドメイン制約やキー制約ではない一般制約が存在することを避けるためです。ほとんどのデータベースでは、属性に対するドメイン制約とキー制約のテストは簡単に行えます。しかし、一般制約は通常、ストアドプロシージャ(多くの場合トリガー型)という特別なデータベースプログラミングを必要とし、保守コストとデータベース実行コストが高くなります。そのため、一般制約はドメイン制約とキー制約に分割されます。
ドメイン/キー正規形で新しいデータベースを構築する方が、多くの異常を含む可能性のある下位正規形のデータベースから変換するよりもはるかに簡単です。しかしながら、ドメイン/キー正規形のデータベースを正常に構築することは、経験豊富なデータベースプログラマーにとっても依然として困難な作業です。したがって、ドメイン/キー正規形はほとんどのデータベースで見られる問題を解消しますが、実現コストが最も高い正規形になる傾向があります。さらに、ドメイン/キー正規形を実現できない場合、下位正規形のみに準拠したデータベースでは時間の経過とともに異常が発生するため、長期的な隠れたコストが発生する可能性があります。
第3正規形、ボイス・コッド正規形、第4正規形、および第5正規形は、ドメイン/キー正規形の特殊なケースです。いずれも、関数依存関係、多値依存関係、または結合依存関係を持ち、これらはスーパーキーに変換できます。これらの正規形のドメインは制約されていないため、すべてのドメイン制約が満たされます。ただし、高次の正規形をドメイン/キー正規形に変換することは、必ずしも依存関係を維持する変換とは限らず、したがって必ずしも可能であるとは限りません。
次の表では DKNF 違反が発生します。
| 裕福な人 | 富裕層タイプ | 純資産(ドル) |
|---|---|---|
| スティーブ | 富豪 | 1億2454万3621 |
| ロデリック | 億万長者 | 6,553,228,893 |
| カトリーナ | 億万長者 | 8,829,462,998 |
| ゲイリー | 富豪 | 4億9556万5211円 |
(富裕層のドメインは、事前に定義された富裕層のサンプル内のすべての富裕層の名前で構成され、富裕層のタイプのドメインは「百万長者」と「億万長者」の値で構成され、純資産ドルのドメインは 1,000,000 以上のすべての整数で構成されていると仮定します。)
富裕層タイプと純資産(ドル)を結び付ける制約がありますが、両者を推測することはできません。この制約は、百万長者の純資産が1,000,000から999,999,999まで(両端を含む)であるのに対し、億万長者の純資産が1,000,000,000以上であると規定しています。この制約はドメイン制約でもキー制約でもないため、ドメイン制約やキー制約を用いても、矛盾した富裕層タイプと純資産(ドル)の組み合わせがデータベースに存在しないことを保証することはできません。
富裕層タイプの列を削除することで、DKNF違反を解消できます。富裕層の百万長者または億万長者というステータスは、富裕ステータス表で定義されているドル建て純資産によって決定されるため、有用な情報が失われることはありません。
| 裕福な人 | 純資産(ドル) |
|---|---|
| スティーブ | 1億2454万3621 |
| ロデリック | 6,553,228,893 |
| カトリーナ | 8,829,462,998 |
| ゲイリー | 4億9556万5211円 |
| 状態 | 最小 | 最大 |
|---|---|---|
| 富豪 | 1,000,000 | 999,999,999 |
| 億万長者 | 1,000,000,000 | 999,999,999,999 |
外部キーとして表現できない関係は、DKNF の明らかな違反です。例えば、「親 ID」属性が複数の参照先テーブルのいずれかを指し示し、その参照先が 2 番目の「親タイプ」属性に依存している場合、DKNF に違反します。