數據庫設計三大範式與BCNF

參考:

1.範式間的區別

http://www.cnblogs.com/winlinglin/archive/2008/11/19/1336337.html

2. 數據庫範式1NF 2NF 3NF BCNF

http://dev.firnow.com/course/7_databases/sql/sqlServer/20090502/166234.html

3.薩師煊&王珊《數據庫系統概論》(第三版)

概念:

(1) 實體(entity):就是實際應用中要用數據描述的事物,一般是名詞。

(2) 字段(fields):就是一項數據,也就是我們平常所說的“列”。

(3) 記錄(record):一個實體的一個實例所特有的相關數據項的集合,也就是我們平常所說的“行”。

(4) 鍵(key):可唯一標識一條記錄的一個字段或字段集,有時翻譯爲“碼”。

(5) 主鍵(primary key):用於唯一標識一個表中的一條記錄的鍵。每個主鍵應該具有下列特徵:

1.  唯一的。

2.最小 的(儘量選擇最少鍵的組合)。

3.非空。

4.不可更新的(不能隨時更改)

(6) 外鍵(foreign keys):對連接父表和子表的相關記錄的主鍵字段的複製。

(7) 依賴表(dependent table):也稱爲弱實體(weak entity)是需要用父表標識的子表。

(8) 關聯表(associative table):是多對多關係中兩個父表的子表。

(9) 實體完整性:每個表必須有一個有效的主 鍵。

(10) 參照完整性:沒有不相匹配的外鍵值。

名詞解釋:

函數依賴:

通俗描述:

描述一個學生的關係,可以有學號(SNO),姓名(SNAME),系名(SDEPT)等幾個屬性。由於一個學號只對應一個學生,一個學生只在一個系學習。因此當學號確定之後,姓名和該學生所在系的值也就唯一被確定了,就像自變量x確定之後,相應的函數值f(x)也就唯一地被確定了一樣,稱SNO函數決定SNAME和SDEPT,或者說SNAME,SDEPT函數依賴於SNO,記爲:SNO -> SNAME, SNO -> SDEPT.

嚴格定義:

設R(U)是屬性集U上的關係模式。X,Y是U的子集。若對於R(U)的任意一個可能的關係r,r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不相等,則稱X函數確定Y或者Y函數依賴於X。記爲X->Y。

(如果不知道“關係”、“屬性集”等定義,自己看大學教材去。這裏的定義摘自薩師煊&王珊《數據庫系統概論》第三版)

完全函數依賴:

在R(U)中,如果Y函數依賴於X,並且對於X的任何一個真子集X',都有Y不函數依賴於X', 則稱Y對X完全函數依賴。否則稱Y對X部分函數依賴。

舉個例子就明白了。假設一個學生有幾個屬性

SNO 學號

SNAME 姓名

SDEPT 系

SAGE 年齡

CNO 班級號

G 成績

對於(SNO,SNAME,SDEPT,SAGE,CNO,G)來說,G完全依賴於(SNO, CNO), 因爲(SNO,CNO)可以決定G,而SNO和CNO都不能單獨決定G。

而SAGE部分函數依賴於(SNO,CNO),因爲(SNO,CNO)可以決定SAGE,而單獨的SNO也可以決定SAGE。

傳遞函數依賴:

在R(U)中,如果X->Y, Y->Z, 則稱Z對X傳遞函數依賴。

候選鍵

(又稱候選碼,候選關鍵字,碼 ,candidate key):

設K是一個R(U)中的屬性或屬性集合(注意可以是屬性集合,也即多個屬性的組合),若K完全函數確定U,則K爲R的候選鍵(Candidate key);

通俗地說就是,能夠確定全部屬性的某個屬性或某組屬性,稱爲候選鍵。若候選鍵多於一個,則選定其中一個作爲主鍵。

主屬性:

包含在任何一個候選鍵中的屬性,叫做主屬性(Prime attribute),不包含在任何候選鍵中的屬性稱爲非主屬性或非鍵屬性或非關鍵字段。

例子:

在(SNO, CNO, G)中,SNO和CNO這倆合起來就是一個候選鍵,因爲每個元組只要確定了SNO和CNO,則其它所有屬性都可以根據SNO和CNO來確定。而SNO和CNO就都是“主屬性”,G是“非主屬性”。由於此例中只有一個候選鍵,於是只能選擇(SNO, CNO)作爲主鍵。

在(SNO,SDEPT, SNAME)中,SNO是一個候選鍵,因爲只要SNO確定了,其它所有屬性也都確定了,如果保證沒有重名的話,則SNAME也是一個候選鍵,於是可以選SNO或者SNAME之一作爲候選鍵。如果不能保證沒有重名,就不能把SNAME當成候選鍵,於是就只有SNO能夠做主鍵。

範式:

第一範式不多說了

指數據庫表的每一列都是不可分割的基本數據項
在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不滿足第一範式(1NF)的數據庫就不是關係數據庫。

第二範式:

數據庫表中不存在非關鍵字段對任一候選鍵的部分函數依賴,也即所有非關鍵字 段都完全依賴於任意一組候選關鍵字。

2NF的違例只會出現在候選鍵由超過一個字段構成的表中,因爲對單關鍵字字段不存在部分依賴問題。

例子:(學號, 姓名, 年齡, 課程名稱, 成績, 學分)

候選鍵只有一個,就是(姓名,課程名稱),則主鍵就是(姓名,課程名稱)

存在如下決定關係:

1:(學號, 課程名稱) → (姓名, 年齡, 成績, 學分)

2:(課程名稱) → (學分)

3:(學號) → (姓名, 年齡)

其中,姓名、年齡、學分是部分依賴於主鍵的,而成績是完全依賴於主鍵的,存在部分依賴關係,所以不滿足第二範式。

這會造成如下問題

(1) 數據冗餘:

同一門課程由n個學生選修,"學分"就重複n-1次;同一個學生選修了m門課程,姓名和年齡就重複了m-1次。

(2) 更新異常:

若調整了某門課程的學分,數據表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。

(3) 插入異常:

假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入數據 庫。

(4) 刪除異常:

假設一批學生已經完成課程的選修,這些選修記錄就應該從數據庫表中刪除。但是,與此同 時,課程名稱和學分信息也被刪除了。很顯然,這也會導致插入異常。

問題就在於存在非主屬性對主鍵的部分依賴

解決辦法:把原表(學號, 姓名, 年齡, 課程名稱, 成績, 學分)分成三個表:

學生:Student(學號, 姓名, 年齡);

課程:Course(課程名稱, 學分);

選課關 系:SelectCourse(學號, 課程名稱, 成績)。

第三範式:

在第二範式的基礎上,數據表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三範式

出現傳遞依賴A->B->C,即主鍵A可以確定出某一非關鍵字段B,而B又可以確定出C,這意味着C依賴於一個非關鍵字段B。因此第三範式又可描述爲:表中不存在可以確定其他非關鍵字的非鍵字段

例子:表:(學號, 姓名, 年齡, 所在學院, 學院地點, 學院電話)

該表中候選字段只有“學號”,於是“學號”做主鍵。由於主鍵是單一屬性,所以不存在非主屬性對主鍵的部分函數依賴的問題,所以必然滿足第二範式。但是存在如下傳遞依賴

(學號) → (所在學院) → (學院地點, 學院電話)

學院地點和學院電話傳遞依賴於學號,而學院地點和學院電話都是非關鍵字段,即表中出現了“某一非關鍵字段可以確定出其它非關鍵字段”的情況,於是違反了第三範式。

解決辦法:

把原表分成兩個表:

學生:(學號, 姓名, 年齡, 所在學院);

學院:(學院, 地點, 電話)。

BCNF:

BCNF意味着在關係模式中每一個決定因素都包含候選鍵,也就是說,只要屬性或屬性組A能夠決定任何一個屬性B,則A的子集中必須有候選鍵。BCNF範式排除了任何屬性(不光是非主屬性,2NF和3NF所限制的都是非主屬性)對候選鍵的傳遞依賴與部分依賴。

例子:

 Untitled picture

例子二:

假設倉庫管理關係表爲StorehouseManage(倉庫ID, 存儲物品ID, 管理員ID, 數量),且有一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品。這個數據庫表中存在如下決定關係:

(倉庫ID, 存儲物品ID) →(管理員ID, 數量)

(管理員ID, 存儲物品ID) → (倉庫ID, 數量)

所以,(倉庫ID, 存儲物品ID)和(管理員ID, 存儲物品ID)都是StorehouseManage的候選關鍵字,表中的唯一非關鍵字段爲數量,它是符合第三範式的。但是,由於存在如下決定關係:

(倉庫ID) → (管理員ID)

(管理員ID) → (倉庫ID)

倉庫I是決定因素,但倉庫ID不包含候選鍵(candidate key,也就是候選碼,簡稱碼)。

同樣的,管理員ID也是決定因素,但不包含候選鍵。

所以該表不滿足BCNF。

3NF和BCNF是在函數依賴的條件下對模式分解所能達到的最大程度。一個模式中的關係模式如果都屬於BCNF,那麼在函數依賴範圍內,它已經實現了徹底的分離,已消除了插入和刪除的異常。3NF的“不徹底”性表現在可能存在主屬性對鍵的部分依賴和傳遞依賴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章