书中的概念:
关系模式R〈U,F〉∈1NF。若X→Y且Y不包含X时X必含有码,则R〈U,F〉∈BCNF。
也就是说,关系模式R〈U,F〉中,若每一个决定因素都包含码,则R〈U,F〉∈BCNF。
由关系模式的定义可以得到如下结论,若R属于BCNF,则R有:
1.所有非主属性对每一个码都是完全函数依赖。
2.所有的主属性对每一个不包含它的码,也是完全函数依赖。
3.没有任何属性完全函数依赖于非码的任何一组属性。
我的理解:
非码属性不要完全决定码属性,主属性也不要部分/传递依赖码属性,
换句话来说,就是X→Y时,X一定含有码(候选码中的任意一个)
如:
例1:
在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。
每一教师只教一门课。每门课由一名教师教,某一学生选定某门课,就确定了一个固定的教师。某个学生选修某个教师的课就确定了所选课的名称 : (S,J)→T,(S,T)→J,T→J
显然,在STJ中,(S,J),(S,T)都是候选码,S,T,J都是主属性,所以没有非主属性对码的传递依赖和部分依赖,所以属于3NF。
但是T→J的决定因素既不包含候选码(S,J),也不包含候选码(S,T),所以不是BCNF。
也可以用以上三条结论认证。
(1)当(S,J)为码时,主属性T依旧被码属性J依赖(T→J),违背了以上第3条。
(2)当(S,T)为码时,主属性J依旧被码属性T部分函数依赖(T→J),违背了以上第2条。
综上所述,关系模式STJ不是BCNF。
如何将它们改成BCNF呢?
书上有分解法的算法,可以将模式转换为BCNF。书上的很抽象,但是运用起来很简单。简单来说就是把不合法的属性拆出来组成新的模式。
T→J的决定因素既不包含候选码(S,J),也不包含候选码(S,T),所以将其分解,T+J是U的真子集,故分解:S1:{TJ},将被确定的J移除:S2:U-{J}={S,T}
所以原模式被分为ST(S,T)和TJ(T,J)
同样的算法,例2:
那么关系模式 dep(D,M,G,N)中D表示仓库名,M表示管理员,G表示货物名,N表示货物的数量
已知函数依赖集:D → M,M → D,(D,G)→ N
将其分为BC范式:
主属性:D,M,G
候选码:(D,G),(M,G)
D → M,M → D,D和M都不包含候选码(D,G),也不包含候选码(M,G)
此时分解:D → M:S1:{D,M},S2:U-M{D,G,N}
这时,有S1{D → M},候选码D,S2{(D,G)→ N}候选码(D,G),满足BCNF,分解完成。
或者分解:M → D:S1:{M,D},S2:U-D{G,M,N}
这时,有S1{M → D},候选码M,S2{(D,M)→ N}候选码(D,M),满足BCNF,分解完成。
所以要想使模式满足BC范式,本例有两种分解方式。