2NF以上的范式都是對關系上的依賴進行限制,其中最重要的是3NF和BCNF。
- ?BCNF:所有非平凡依賴都以超鍵為決定子。一個屬性集只有包含了整個的鍵,才能決定集外的屬性。
- 3NF:其非平凡依賴X->A必須滿足:X是超鍵,或者A是主屬性。3NF比BCNF有所放松,允許含鍵不完全的屬性集決定集外的屬性,但必須是主屬性。
- 不符合3NF的情況有兩種:
- 鍵的真子集決定非主屬性,即非主屬性對鍵的部分依賴;
- 既非超鍵也非鍵的真子集決定非主屬性,由此將可證明,存在非主屬性對鍵的傳遞依賴。
如果一個關系不滿足2但滿足1,稱此關系符合2NF。
2NF和3NF的涵義是:鍵是關系的標識信息,非主屬性是附屬信息。如果附屬信息對標識信息的依賴不夠緊密,關系的語義單純性就差,從而容易出現各種更新異常。
如果違反2NF,既存在非主屬性對鍵的部分依賴,會有什么問題?例如關系模式SCGT(S#,C#,G,TN),S#是學生號,C#是課程號,G是成績,TN是任課教師姓名,假設每門課只有一個教師。(S#,C#)是鍵,C#->TN是非主屬性對鍵的部分依賴,因為它的存在會產生三種更新異常:1). 不開課的教師姓名無法插入;2). 一門課的所有學生都退選,則任課教師姓名無法保留;3). 一門課更換教師時,必須對選該課的所有學生進行修改。非主屬性對鍵的部分依賴反映了附屬信息和標識信息的缺乏整體一致性,所以會產生以上問題。
如果符合2NF,但違反3NF,即存在非主屬性對鍵的傳遞依賴,會有什么問題?例如關系模式SDL(S#,DEPT,LOC),S#是學生號,DEPT是所在系,LOC是系的辦公地,這里S#是鍵,S#->DEPT,DEPT-/>S#,DEPT->LOC,LOC傳遞依賴于S#,因為它的存在會產生三種更新異常:1). 如果一個系新成立尚未招生,則無法插入;2). 如果一個系不再招生,但仍為其他系開課,則現有學生畢業后,系的信息無法保留;3). 一個系更換辦公地時,必須對該系的所有學生進行修改。非主屬性對鍵的傳遞依賴反映了附屬信息和標識信息缺乏直接一致性,所以會產生以上問題。缺乏直接一致不如缺乏整體一致那樣嚴重,所以到了3NF才排除。
那么BCNF的涵義在哪里呢?
2NF和3NF對一個關系模式中的非主屬性加以限制,而忽略鍵之間的關系。如果一個主屬性依賴含鍵不完全的屬性組意味著什么呢?可以證明,該依賴涉及不止一個鍵,其決定子有兩種情況,一種是部分鍵,一種是含部分鍵和鍵外的屬性。第一種情況下存在一個鍵之外的屬性對該鍵的部分依賴;第二種情況下,取一個不含前述主屬性的鍵,易知存在該屬性對該鍵的傳遞依賴,即一個鍵外的屬性對該鍵的傳遞依賴,排除這兩種情況就得到BCNF。為什么要這樣做呢?因為有多個鍵的情況下,必須照顧每一個鍵,如果鍵之外的屬性和該鍵不能保持整體和直接的一致,也可能產生更新異常。例如SCZ(S,C,Z),S,C,Z分別表示街道,城市,郵編,關系模式上的依賴集為{SC->Z,Z->C},SC和SZ都是鍵。如果插入一個城市的總郵編,必須借助一個街道,刪除這個街道,城市的總郵編也被刪除,出現這種情況是因為C與SZ鍵缺乏整體一致性。
參考:
王能斌《數據庫系統教程》/電子工業出版社