2017-03-31 60 views
0

所以我有FD的關係模式,它看起來像這樣:確定BCNF侵犯

R(A,B,C,D): AB -> C, B -> D, CD -> A, AD -> B 

現在我試圖找到所有的BCNF侵犯,然後分解表。我計算的所有FD的左側,發現這個:

AB+ = {A, B, C, D} 
B+ = {B, D} <- violation 
CD+ = {C, D, A, B} 
AD+ = {A, D, B, C} 

所以我分解表看起來像這樣:

R1 (B, D) 
R2 (A, B, C) 

唯一的問題是,我不知道這是我在分解表格時必須要做的,或者我必須做更多的事情。我主要對AB,CD和AD部分感到困惑。

回答

0

在你的榜樣,B → D實際上是違反了BCNF,因爲在所有其他depedencies左手邊是一個關鍵的唯一的依賴(實際上所有的關係鍵是(A D)(A B)(B C)(C D)) 。

所以,你可以通過在含有B+R1,拆分原有的關係R分解,即BDR2,含R - B+ + B,即ABC,因爲你已經正確地找到。

然後應該再次應用這個過程,如果在任何分解關係中存在違反BCNF的一些依賴關係。但這種情況並非如此,因爲在R1唯一的依賴是B → D,與B中的唯一鑰匙,並與依賴關係R2AB → CBC → A,有鑰匙ABBC

此時可以終止進程,因爲R1R2都在BCNF中。但是我們也應該注意到,由於CD → AAD → B已經丟失,所以這種分解並不是保留了依賴關係。

+0

我唯一想知道的是CD和AD,所以我認爲我沒有辦法保留這些依賴關係。 –

+0

是的,衆所周知,分解BCNF中的關係的算法可能會導致依賴關係的丟失。考慮例如AD-> B。爲了保持這種依賴關係,你可以添加一個新的關係ADB,但是它將具有違反正常形式的依賴關係B-> D。所以你應該分解BD和AB,並且你將失去依賴。 – Renzo