2011-10-16 120 views
2

如何判斷關係R是否屬於BCNF和3NF?關係數據庫中的BCNF/3NF

我正在閱讀教科書,它告訴我有3個主要屬性您正在看,但我無法理解他們在說什麼,或者至少應用他們在說什麼時給定關係和FD。

的3個屬性: 給定關係R與屬性A,和X的R屬性的子集,對於每一個FDX⟶AF中,下列說法的一個爲真:

  • A∈X;也就是說,它是一個很小的FD(∈意思是 「在X被發現」)
  • X是超密鑰
  • A是一些關鍵的R

頂部的兩個對應於BCNF的一部分,並且3NF包括第三。

+0

開始 - 我懷疑他們來自一個標準定理,列出它們將有助於集中反應。 – 2011-10-16 01:04:33

+0

第三條語句 - 「A是R的某個鍵的一部分」 - 對我來說,看起來更像是2NF而不是3NF - 請參閱http://en.wikipedia.org/wiki/Second_normal_form。 –

回答

4

該書SQL Antipatterns by Bill Karwin在第303頁有一個關於BCNF和3NF的很好的例子,雖然有點複雜,但我相信比迄今爲止所讀到的差異的任何描述都更加簡潔地指出了區別。

例如,假設我們有三個標籤類型:描述錯誤的 衝擊標記,標記子系統的缺陷影響,以及標籤 描述修正這些錯誤。我們決定每個bug最多隻能有一個特定類型的標籤 。我們的候選密鑰可能是bug_idtag,但它也可能是bug_idtag_type。任一對 列都將足夠具體,可以分別處理每一行。

bug_id tag  tag_type 
------------------------ 
1234 crash impact 
3456 printing subsystem 
3456 crash impact 
5678 report subsystem 
5678 crash impact 
5678 data  fix 

然後這本書改變了這種單一的表(滿足3NF)爲滿足BCNF兩個表:通過在上市後的屬性

bug_id tag 
---------- 
1234 crash 
3456 printing 
3456 crash 
5678 report 
5678 crash 
5678 data 

tag  tag_type 
------------------ 
crash  impact 
printing subsystem 
report subsystem 
data  fix 
+2

感覺這裏已經應用了一點點的手。你從{id,type - > tag;標籤 - >類型},​​並從3NF關係(id,tag,type)分解爲BCNF關係(id,tag)和(tag,type)。這種分解將是無損連接,但是你沒有保存FD(id,type - > tag):現在可以插入(bug_id,tag)值(3456,報告),而之前會破壞關鍵的約束。有時候這是可以接受的,但你應該意識到你已經放寬了約束。 – beldaz