域键范式

关系数据库设计的域键范式 (Domain-key normal form, DK/NF)，是数据库规范化的一个级别，以去除关系不包含于域约束（domain constraint）的其他约束。 

域约束指出给定属性的取值范围。键约束指出这几个属性唯一确定了表中的一行。

域键范式使得一个关系的所有约束都是键与域（domain）定义的逻辑蕴涵；因而执行对键与域上的限制与条件后，将导致所有的约束都满足。满足域键范式，使得数据库避免了不是清晰的域约束或键约束的一般性约束。这种一般性约束往往需要特殊编程（如存储过程）来检验是否满足。

第三范式、BC范式、第四范式与第五范式是域键范式的特例。因为函数依赖、多值依赖与连接（join）依赖都可以转换为（超）键。这些范式对域约束没有讨论，可看作没有域约束。

 例子 
下表违反了DKNF：

 + Wealthy Person(富人)
   Wealthy Person(富人)
  Wealthy Person Type(富人类型)
  Net Worth in Dollars(美元净值)
   Steve
  Eccentric Millionaire
  124,543,621
   Roderick
  Evil Billionaire
  6,553,228,893
   Katrina
  Eccentric Billionaire
  8,829,462,998
   Gary
  Evil Millionaire
  495,565,211

(假定富人属性包括了预定集样本集中所有富人的名字；富人类型属性取值为'Eccentric Millionaire', 'Eccentric Billionaire', 'Evil Millionaire', 'Evil Billionaire'；美元净值属性取值为大于等于1,000,000的整数)

在富人类型属性与美元净值属性之间存在约束，即使不能从一个属性推得另一个属性：Eccentric Millionaire或Evil Millionaire的美元净值应在1,000,000 到 999,999,999，而Eccentric Billionaire或Evil Billionaire的美元净值应大于等于1,000,000,000。该约束既不是域约束（domain constraint）也不是键约束（key constraint）。因为不能用域约束或键约束来保证表中不出现不一致的Wealthy Person Type / Net Worth。 

违反DKNF的问题可把Wealthy Person Type属性域改为两个值：'Evil'与'Eccentric'，而百万富翁还是十亿富翁的状态可通过Net Worth in Dollars属性确定，因此没有损失信息。 

 + Wealthy Person
   Wealthy Person
  Wealthy Person Type
  Net Worth in Dollars
   Steve
  Eccentric
  124,543,621
   Roderick
  Evil
  6,553,228,893
   Katrina
  Eccentric
  8,829,462,998
   Gary
  Evil
  495,565,211

 + Wealthiness Status(財富狀況)
   Status(狀況)
  Minimum(最少)
  Maximum(最多)
   Millionaire
  1,000,000
  999,999,999
   Billionaire
  1,000,000,000
  999,999,999,999

外键
表之间的关系（Relationships）如果不能表示为外键，显然违反域键范式。例如，"Parent ID"属性可以指向几张表中的某个，这取决于另外的属性"Parent Type", 这违反了DKNF.


参见
 引用完整性
 資料庫正規化

参考文献



外部链接
 Database Normalization Basics by Mike Chapple (About.com)
 An Introduction to Database Normalization by Mike Hillyer.
 Normalization by ITS, University of Texas.
 A tutorial on the first 3 normal forms by Fred Coulson
 Description of the database normalization basics by Microsoft

DK/NF