如何判斷關係R是否屬於BCNF和3NF?關係數據庫中的BCNF/3NF
我正在閱讀教科書,它告訴我有3個主要屬性您正在看,但我無法理解他們在說什麼,或者至少應用他們在說什麼時給定關係和FD。
的3個屬性: 給定關係R與屬性A,和X的R屬性的子集,對於每一個FDX⟶AF中,下列說法的一個爲真:
- A∈X;也就是說,它是一個很小的FD(∈意思是 「在X被發現」)
- X是超密鑰
- A是一些關鍵的R
頂部的兩個對應於BCNF的一部分,並且3NF包括第三。
如何判斷關係R是否屬於BCNF和3NF?關係數據庫中的BCNF/3NF
我正在閱讀教科書,它告訴我有3個主要屬性您正在看,但我無法理解他們在說什麼,或者至少應用他們在說什麼時給定關係和FD。
的3個屬性: 給定關係R與屬性A,和X的R屬性的子集,對於每一個FDX⟶AF中,下列說法的一個爲真:
頂部的兩個對應於BCNF的一部分,並且3NF包括第三。
該書SQL Antipatterns by Bill Karwin在第303頁有一個關於BCNF和3NF的很好的例子,雖然有點複雜,但我相信比迄今爲止所讀到的差異的任何描述都更加簡潔地指出了區別。
例如,假設我們有三個標籤類型:描述錯誤的 衝擊標記,標記子系統的缺陷影響,以及標籤 描述修正這些錯誤。我們決定每個bug最多隻能有一個特定類型的標籤 。我們的候選密鑰可能是
bug_id
加tag
,但它也可能是bug_id
加tag_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
感覺這裏已經應用了一點點的手。你從{id,type - > tag;標籤 - >類型},並從3NF關係(id,tag,type)分解爲BCNF關係(id,tag)和(tag,type)。這種分解將是無損連接,但是你沒有保存FD(id,type - > tag):現在可以插入(bug_id,tag)值(3456,報告),而之前會破壞關鍵的約束。有時候這是可以接受的,但你應該意識到你已經放寬了約束。 – beldaz
開始 - 我懷疑他們來自一個標準定理,列出它們將有助於集中反應。 – 2011-10-16 01:04:33
第三條語句 - 「A是R的某個鍵的一部分」 - 對我來說,看起來更像是2NF而不是3NF - 請參閱http://en.wikipedia.org/wiki/Second_normal_form。 –