例2. 关系模式R<U,F>,其中:U={A,B,C,D,E},F={A→C,C→D,B→C,DE→C,CE→A},将其分解成BCNF并保持无损连接;
- 第一步:求取码
首先查找L属性,即只在依赖函数左端出现过的属性,结果为B,E。
然后计算B在F上的闭包为BCD,E在F上的闭包为E,显然都不等于U,但是BE的闭包等于U
因此BE为R的唯一候选码
- 第二部:逐步分解
第一次分解
A->C违背BCNF的定义,单独拿出构成关系模式R11(A,C),F11(A->C),key11=A。
同样,函数依赖右端中不必再出现C,可以通过传递依赖尽可能消除C,那么得到
B->D,DE->D,BE->A,A->D,AE->A,把能换的全换了保险。然后就将R分解成了
R12(A,B,D,E),F12(B->D,DE->D,BE->A,A->D,AE->A),key12=BE
然后计算F11与F12求最小依赖集
F11不变,本身就是,F12经过单属性化,无冗余化,既约化后变为
R12(A,B,D,E),F12(B->D,BE->A,A->D),key12=BE
综上R分解成为:R11(AC),F11(A->C),key11=A,R12(A,B,D,E),F12(B->D,BE->A,A->D),key12=BE
第二次分解
鉴于R11已经为BCNF,故可以不再分解。但R12显然不是,需要继续分解。
显然R12中的A->D不满足BCNF定义,单独拿出,R21(A,D),F21(A->D),key=A,
函数依赖右端中不必再出现D,可以通过传递依赖尽可能消除D,那么得到
R22(A,B,D,E),F12(B->D,BE->A),key22=BE
此时F21与F22均是最小依赖集不需要变
综上R12分解成为:R21(A,D),F21(A->D),key=A,R22(A,B,D,E),F12(B->D,BE->A),key22=BE
第三次分解
鉴于R21已经为BCNF,故可以不再分解。但R22显然不是,需要继续分解。
显然B->D不满足BCNF定义直接拿出
R31(B,D),F31(B->D),key=B,那么剩余的BE->A也可以构成BCNF
R32(ABE),F32(BE->A),key=BE
显然R31与R32都满足BCNF,分解完毕
综上R22分解成为:R31(B,D),F31(B->D),key=B,R32(ABE),F32(BE->A),key=BE
综上所述R分解为下表
R11(AC),F11(A->C),key11=A R21(A,D),F21(A->D),key=A R31(B,D),F31(B->D),key=B R32(ABE),F32(BE->A),key=BE
- 第三步:验证上述BCNF分解就是无损连接
做表
A B C D E AC a1 b12 a3 b14 b15 AD a1 b22 b23 a4 b25 BD b31 a2 b33 a4 b35 ABE a1 a2 b43 b44 a5 观察函数依赖F
- A->C,改表
A B C D E AC a1 a2 a3 b14 b15 AD a1 a2 b23 a4 b25 BD b31 a2 b33 a4 b35 ABE a1 a2 b43 b44 a5
- B->C,改表
A B C D E AC a1 a2 a3 b14 b15 AD a1 a2 a3 a4 b25 BD b31 a2 a3 a4 b35 ABE a1 a2 a3 b44 a5
- C->D,改表
A B C D E AC a1 a2 a3 a4 b15 AD a1 a2 a3 a4 b25 BD b31 a2 a3 a4 b35 ABE a1 a2 a3 a4 a5 此时,第五行全部为a,是无损连接,证明完毕