三范式是BC范式的放宽
三范式条件(满足一个即可):
- α–>β是平凡的函数依赖,除了子集和父集的函数依赖,大多的函数依赖都是非平凡的
- α是关系模式R的一个超码
- (β-α)属性集里的所有属性都被包含在 R的candidate key里,注意 (β-α)的属性集里的所有元素,可以 分别被包含在多个 candidate key中
三范式分解算法伪代码如下:
//在关系模式 R 的函数依赖的正则覆盖F_c下做如下算法
i=0
for each 非平凡函数依赖 α-->β函数依赖 in F_c
R_i= {α + β} //此R_i关系模式由α+β组成
i++
if 不存在R_i能包含 R 的candidate key,其中i为0,1,2,3.....n
R_i = R的任意candidate key //使满足条件2或3
//以下操作用于冗余
loop UNTILL {R_I}中没有冗余的关系模式
if R_i中的元素都在 R_j中 //冗余
删除R_i //! 删除此关系模式并不会造成关系模式有损分解
END LOOP
该三范式分解算法是无损的且保持依赖的