域键范式

维基百科,自由的百科全书

关系数据库设计的域键范式 (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.


参见[编辑]

参考文献[编辑]

外部链接[编辑]