2013-05-12 32 views
6

我想了解BCNF是什麼,我有這樣的關係:BCNF同一個代理鍵和兩個獨特的按鍵

學生(ID,SSN,電子郵件,名字,姓氏)

其中

  • ID是主代理鍵與不爲空,並自動遞增特性
  • SSN是與非空屬性的唯一密鑰
  • 電子郵件也是一個獨特的密鑰與非空propery

有沒有什麼違反BCNF,如果是的話,我怎麼能用更好的設計克服這種情況?

編輯

我想寫我的函數依賴,但請糾正我,如果我錯了。

確定其他屬性有三個屬性,所以令人困惑的是ssn和email都存在於方程的左側和右側。看來,這個關係不屬於BCNF但必須有一些錯誤:)

id -> (ssn, email, name, surname) 
ssn -> (id, email, name, surname) 
email -> (id, ssn, name, surname) 

回答

1

是的,你的餐桌位於BCNF。這是因爲您沒有任何重疊的候選鍵 - 即沒有出現在兩個不同鍵中的屬性。

如果你有一些其他屬性,X,它構成了鍵的一部分 - 例如(SSN,X)和(email,X) - 那麼你的表會失敗BCNF,因爲給定SSN和電子郵件對的X應該是相同的。這些關鍵定義將允許給定SSN和電子郵件的X的不同值。

關於BCNF的一個很好的解釋,請閱讀this answer

+0

如果sedran的一組依賴項已完成,那麼是的。但作爲一般規則,重疊鍵的不存在並不意味着關係在BCNF中。如果碰巧有非關鍵依賴或部分關鍵依賴,那麼它不會滿足BCNF。 – sqlvogel 2013-05-12 09:01:10

+0

@sqlvogel - 我想不出如果沒有重疊的鍵,你可能無法在BCNF中。你能告訴我一個例子嗎? – 2013-05-12 14:13:57

+0

例如依賴關係A-> B,其中A和B是不重要的,無論候選關鍵字是什麼,都會違反BCNF(和3NF)。 – sqlvogel 2013-05-15 19:57:42

2

正確回答你的問題的方法就是要確定哪些函數依賴都應該適用。寫下你認爲依賴關係是什麼。如果每個非平凡依賴的左邊是超級鍵,那麼關係滿足BCNF。

+0

謝謝,我編輯了我的問題 – sedran 2013-05-12 07:27:05

-4

電子郵件地址或SSN是唯一的或無可用的限制太強。你可以執行它們,但是你不應該強加它們。 (想一想:外國學生)。 通常,對不屬於您管轄範圍的關鍵域施加任何約束是一個壞主意,即使它們接近於唯一(例如在SSN情況下)。

舉個例子:typo's。假設某人想要以學生身份登記,但看起來她的SSN已被另一個人使用,可能是由錯字造成的。你應該拒絕新的學生,還是刪除舊的? (或者是否允許SSN字段爲非唯一或無效?)

更新/最後說明:本主題標記爲「datatbase-design」和「data-normalization」。我反應了設計選擇(這是有爭議的)。其他人試圖對BCNF方面作出反應(鑑於UNIQUE候選鍵和NOT NULL假設,這是微不足道的)

規範化不良數據模型會給你一個規範化的,但仍然是錯誤的模型。

+2

選擇某些特定鍵的智慧或其他方式與歸一化問題沒有多大關係,因爲這些鍵已經提供。當然,要求學生擁有唯一的電子郵件地址和某種特定的稅號,這不是一個壞主意。很多現實世界的系統*都需要唯一的電子郵件地址作爲標識符,因爲它們很容易被記住,驗證並且相對穩定。如果有重複的SSN出現,那麼不允許它並且要求某人檢查哪些重複項可能被錯誤鍵入或無效是完全合理的。 – sqlvogel 2013-05-12 09:23:02

+0

該OP是一個玩具的例子,它是恕我直言的一個壞*玩具的例子,因爲它隱含的假設有關「外國」的域名。對於真實玩具的例子,老師應該使用真正的玩具問題(例如數獨,拼字遊戲或填字遊戲) – wildplasser 2013-05-12 09:38:59

+3

嗯,告訴亞馬遜或微軟,他們的系統需要獨特的電子郵件地址這一事實使他們成爲「玩具」 !我認爲你是一個對正在歸一化理論中設定完美現實例子的問題作出假設的人。 – sqlvogel 2013-05-12 09:48:27