第一范式
关系中任何属性的域均是原子的。
超码
唯一标识关系中一条元组的一个或者多个属性的集合。
平凡函数依赖
如果B包含于A,则形如A–>B这样的函数依赖是平凡的。
模式R上满足函数依赖集F的关系,说F在r®上成立。
F+表示F集合的闭包。
BCNF范式
按照定义任何只包含两个属性的模式都属于BCNF。
消除所有基于函数依赖发现的冗余
至少有一项成立:
- A->B是平凡依赖;
- A是模式R的一个超码。
分解成为BCNF的一般规则,存在非平凡函数依赖A–>B,且A不是R的超码:
- (A并B);
- (R-(B-A))。
出现问题:BCNF分解会妨碍某些函数依赖造成的检查。
引入一种比BCNF弱的范式:第三范式
第三范式
最小的超码:候选码。
对于F+中所有形如A–>B的函数依赖,下面至少一项成立:
- A–>B是一个平凡的函数依赖;
- A是R的一个超码;
- B-A中的每个属性A都包含于R的一个候选码中。
当不存在保持依赖的BCNF设计时,必须在BCNF和3NF之间进行权衡。
Armstrong公理
AB代表A并B。
找到F的全部F+:
- 自反律;B包含于A,则A–>B成立
- 增补律;A–>B成立且C为一属性集,则AC–>BC成立
- 传递律。如果A–>B和B–>C成立,那么A–>C成立。
公理扩展:
- 合并律:A–>B和A–>C成立,那么A–>BC成立;
- 分解律:A–>BC成立,那么A–>B和A–>C成立;
- 伪传递律:A–>B和BC–>D成立,那么AC–>D成立。
属性集的闭包
如果a–>B,称属性B被a函数确定;
例如:考虑模式R=(A,B,C,G,H,I)以及函数依赖集F{A–>B,A–>C,CG–>H,CG–>I,B–>H}
现在计算函数依赖集下的(AG)+,开始时result = AG/
- 由A–>B,将result 变为ABG;
- 由A–>C,result变为ABCG;
- 由CG–>H,result变为ABCGH;
- 由CG–>I,result变为ABCGHI。
用途:
- 用于计算a函数确定的属性集的高效算法可以用来判断a是否为超码,若a+包含属性R中的所有属性,那么a为超码;
- 检查函数依赖a–>B是否成立,只需要看a+是否包含B;
- 另一种计算F+的方法。
无关属性
去除函数依赖集中的一个属性不改变函数依赖集的闭包;
考虑函数依赖集F及F中的函数依赖a–>b
- 如果A属于a,并且F逻辑蕴含(F-{a-b})并上{(a-A)–>b},则属性A在a中是无关的。
- 如果A属于b,并且函数依赖集(F-{a-b})并上{a–>(b-A)}逻辑蕴含F,则属性A在b中是无关的。
例如:AB–>C,和A–>C,那么B在AB–>C中是无关的。
如何检验一个属性是否是无关属性
例如:假定F包含AB–>CD,A–>E,且E–>C,检验C在AB–>CD中是否是无关的,先计算F = {AB–>CD,A–>E,E–>C}下AB的属性闭包,闭包计算为ABCDE,包含CD,推断出C是无关的。
F的正则覆盖
- 任何函数依赖不存在无关属性;
- 左半部是唯一的,例如不存在A–>B,A–>C,而应该写成A–>BC.
计算正则覆盖:
考虑模式(A,B,C)上的如下函数依赖集F,先来来计算F的正则覆盖:
A–>BC,B–>C,A–>B,AB–>C
- 存在两个函数依赖在箭头左边具有相同的属性集:A–>BC,A–>B将这些函数依赖合并成A–>BC.
- A在AB–>C中是无关的,因为F逻辑蕴含(F-{AB --> C})并上{B–.>C}。
- C在A–>BC中是无关的,因为A–>BC被A–>B和B–>C逻辑蕴含。
- 于是正则覆盖为:A–>B,B–>C.
无损分解和有损分解
无损分解:分解过后的两个关系R1和R2进行自然连接和分解前的R相同。
R1∩R2是R1或者R2的超码,则R的分解就是无损分解。