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