求闭包
求属性集()关于 上的函数依赖集的闭包 。
1、令,i=0。
2、对于F中所有左边为或其子集的函数依赖,把其右边的属性加入,得到。
3、判断是否等于U,若相等,则。判断是否等于,若相等,则。否则继续执行第二步,i++。
例:有关系 ,,,求。
- 令
- 由得,
- 由得,
- 故
求候选码
1、把函数依赖集F中的属性分为L类、R类、LR类和N类。
L类:只在函数依赖左边出现的属性
R类:只在函数依赖右边出现的属性
LR类:在函数依赖左边和右边都出现的属性
N类:未在函数依赖中出现的属性
2、对于各类,有如下性质:
- 若X是L类,则X必为关系R的任一候选码
- 若X是L类,且 ,则X为唯一候选码
- 若X是R类,则X不在任何候选码中
- 若X是N类,则X必包含在任一候选码中
3、对属于L类的属性,不断的加入LR的属性,形成属性组W,求 ,若 ,则W为候选码。求出所有的Wi。
例:有关系 ,,
L类:A、B, R类:C、E, LR类:D, N类:无
则候选码中一定有AB,有,由性质2得,(A, B)为唯一候选码。
分解为2NF
若关系中,主键为W,有且,则可把关系分解为 ,。
判断R1,R2是否均符合2NF;若不符合,则继续按上述方法分解,直到符合为止。
例:有关系 ,,
已知候选码为(A, B),有,故R不符合2NF,分解为,。
R1,R2均符合2NF。
求最小依赖集
1、去掉F中所有函数依赖右边的多属性。
例:
2、去掉F中所有函数依赖左边的多属性。
例:对于,若,则
3、去掉冗余的函数依赖。
例:对于,若去掉该条函数依赖后,对于F中剩下的函数依赖,可以得到,则该条函数依赖可去除
分解为3NF(保持函数依赖)
1、求F的最小依赖集,仍记为F。
2、对于F中为出现的属性,把这些属性构成一个关系模式R0,同时把这些属性从U中除去,剩余的属性仍记为U。
3、若有,且XA=U,则算法终止,否则执行第4步。
4、对F中的所有函数依赖,按具有相同左部的原则分为k组。每一组中出现的所有属性组成的集合为,若则去掉。剩余的所有各组成一个关系模式。
例:有关系,,,
1、求F的最小依赖集
- 右边无多属性,跳过
- 左边为多属性,求得,故不可去除
- 去掉,有;去掉,有;去掉,有,故不可去除
因此,F最小依赖集为。
2、 F中所有属性均有出现,故跳过该步。
3、不满足算法终止条件,跳过该步。
4、按相同左部可分为(A, B, C),(A, D),(D, E)。他们之间彼此不存在包含关系,因此该关系模式可分解为,,。