書中的概念:
關係模式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範式,本例有兩種分解方式。