BCNF理解与应用
1-如何判断是否为BCNF
假设存在关系R和FD集合
=>找出关系R的所有最小化基本集
==>判断FD集合中的每一个FD的左侧是否包含最小化基本集(其中一个, 不一定是最小化, 超键即可), 只要有一个FD不满足, 即R不为BCNF
2-如何进行BCNF分解
假设存在关系R和FD集合
=>首先判断FD集合中不满足BCNF的FD(根据上述的 1.如何判断是否为BCNF),构成一个新的违例FD集合
==>选定其中一个违反BCNF的FD, 举例X—>Y, 根据那个FD进行分解, 得到新生成的两个关系 ,R1={X的闭包}=
{x+}, R2={排除X后的其他属性,X},再依次判断, 直到两个关系均为BCNF
===>将所有的关系统一起来即可
3-例子
(1)
(2)
《数据库系统基础教程 原书第3版》P52
习题3.3.1 对于下列关系模式和FD集合:
a) R(A,B,C,D) FD{AB→C,C→D,D→A}
b) R(A,B,C,D) FD{B→C,B→D}
c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}
d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}
e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}
f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}
做下列事情:
i) 指出所有违反BCNF的FD。不要忘记考虑那些不在上述集合中、但可以由它们推断出但FD。但是,没有必要给出右边含有不止一个属性但BCNF违例。
ii) 根据需要把关系分解为一系列属于BCNF的关系集合。
(a)
(I)找出所有的键(最小基本化集):AB或BC或BD
===>得到违反BCNF的FD集合{C→D,D→A}
(II)在{C→D,D→A}中随机选取一个FD, 假设选取 C→D
===>由{C→D,D→A}知{c}+={ACD},所以R1={C,D,A},R2={C,B},分别对应的FD集合{C->D,D->A}和{}, 再一次判断
====>R2={C,B},明显满足BCNF
====>R1={C,D,A}, FD集合{C->D,D->A}==>键为C, FD集合中{D->A}不满足BCNF,继续分解;
======>根据{D->A}分解 {D}+={A,D},则R1={A,D},R2={D,C},均满足BCNF
(III)所以结果为 {BC},{AD},{CD}