数据库之关系模式规范化
属性集合的闭包
输入:
属性集合{A1,A2,…,An},FD集合S
输出:
闭包{A1,A2,…,An}+
方法:
- 可以分解S中的FD,使每个FD的右边只有一个属性
- 设集合X是为闭包,初始化为{A1,A2,…,An}.
- 反复寻找形如 B1,B2,…,Bn->C,使得B1,B2,…,Bn在X中,而C不在X中,将C加入到X中,重复这个过程.
- 当没有新元素添加时,算法结束,返回X作为结果集合.
计算最小函数依赖集
方法:
- 利用分解规则,将所有函数依赖变成右边都是单个属性的函数依赖.
- 去掉F中多余的函数依赖(因为最小函数依赖集中删除任一FD,集合不再是基本集)
- 去掉各函数依赖左边多余的属性(因为最小函数依赖集从其左边删除一个或多个属性,集合不再是基本集)
函数依赖集的投影
输入:
关系R和通过投影R1=πL®计算得到的关系R1,以及在R中成立的FD的集合S
输出:
在R1中成立的FD集合
方法:
- 令T为最终输出的FD集合,初始化T为空集
- 对于R1的属性集合的每一个子集X,计算X+.该计算依据FD集合S,可能会涉及一些在R模式中而不在R1模式中的属性.对于所有在X+中且属于R1的属性A,将所有非平凡的FD
X -> A
添加到T中. - 经过上面的步骤,T是在R1中成立的FD基本集,但可能还不是最小化基本集.通过下面的方法对T进行修改来构造最小化基本集:
- 如果T中的某个FD F能从T中其他FD推断出来,则从T中删除F.
- 设
Y -> B
是T中的一个FD,Y至少有两个属性,从Y中删除一个属性并记为Z.如果Z -> B
能从T中的FD推断出来,则使用Z -> B
代替Y -> B
. - 重复以上步骤,直到T不再变化
例题:
设有关系模式R(A,B,C,D,E),F是R上成立的函数依赖集,F={AD->B,AC->E,CD->B,B->A,E->D},把关系R分解成S(A,B,C)和其它关系,请给出S中成立的函数依赖并给出S中的FD集合的最小化基本集
BCNF分解算法
输入:
关系R0和其上的函数依赖集S0
输出:
由R0分解出的关系集合,每个关系均属于BCNF
方法: 下面的方法递归进行,初始R=R0,S=S0
- 检验R是否属于BCNF.如果是,直接返回R作为结果
- 如果存在BCNF违例,假设为
X->Y
.先计算属性X的闭包,选择R1=X+作为一个关系模式,令R2包含属性X以及那些不在X+中的属性. - 计算S0在R1和R2的函数依赖集投影,分别记为S1和S2.
- 使用本算法递归分解R1和R2,返回这些分解得到的结果集合.
总结
BCNF分解算法
从违反BCNF的FD开始分解.
对一个关系进行BCNF分解,则原始关系可以通过自然连接来精确的恢复.
具有无损链接和依赖保持性质的3NF综合算法
输入:
关系R和其上成立的函数依赖集F
输出:
由R分解出的关系集合,其中每个关系均属于3NF.分解具有无损连接和依赖保持
性质
方法:
- 找出F的一个最小基本集记为G.
- 对于G中的每一个FD X -> A ,将XA作为分解出的某个关系的模式.
- 如果第2步分解出的关系的模式均不包含R的超键,增加一个关系,其模式为R的任何一个键.
chase 算法
作用
用来检验一个关系在其分解上的投影是否可以通过重新连接来恢复原关系.
无损链接的定义
将分解的关系自然连接后的每个元组都属于R,称为分解包含无损链接