數據庫原理-范式


摘自: http://www.cnblogs.com/ybwang/archive/2010/06/04/1751279.html

[學習筆記]數據庫設計三大范式與BCNF,學習筆記


三大范式與BCNF,筆記


參考:


1.范式間的區別


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



  1. 數據庫范式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的“不徹底”性表現在可能存在主屬性對鍵的部分依賴和傳遞依賴。

0 個評論

要回覆文章請先登錄註冊