數(shù)據(jù)庫三大范式詳解_第1頁
數(shù)據(jù)庫三大范式詳解_第2頁
數(shù)據(jù)庫三大范式詳解_第3頁
數(shù)據(jù)庫三大范式詳解_第4頁
數(shù)據(jù)庫三大范式詳解_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、數(shù)據(jù)庫三大范式詳解作者:佚名文章來源:本站原創(chuàng)點(diǎn)擊數(shù):宙1925更新時(shí)間:2009-8-7數(shù)據(jù)庫范式1NF 2NF 3NF BCNF(實(shí)例)設(shè)計(jì)范式(范式,數(shù)據(jù)庫設(shè)計(jì)范式,數(shù)據(jù)庫的設(shè)計(jì)范式)是符合某一種級別的關(guān)系模式的集合。 構(gòu)造數(shù)據(jù)庫必須遵循一定的規(guī)則。在關(guān)系數(shù)據(jù)庫中,這種規(guī)則就是范式。關(guān)系數(shù)據(jù)庫中的關(guān) 系必須滿足一定的要求,即滿足不同的范式。目前關(guān)系數(shù)據(jù)庫有六種范式:第一范式(1NF)、 第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多 要求的稱為第二范式(2NF),

2、其余范式以次類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF) 就行了。下面我們舉例介紹第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。在創(chuàng)建一個(gè)數(shù)據(jù)庫的過程中,范化是將其轉(zhuǎn)化為一些表的過程,這種方法可以使從數(shù)據(jù)庫得 到的結(jié)果更加明確。這樣可能使數(shù)據(jù)庫產(chǎn)生重復(fù)數(shù)據(jù),從而導(dǎo)致創(chuàng)建多余的表。范化是在識(shí) 別數(shù)據(jù)庫中的數(shù)據(jù)元素、關(guān)系,以及定義所需的表和各表中的項(xiàng)目這些初始工作之后的一個(gè) 細(xì)化的過程。下面是范化的一個(gè)例子Customer Item purchased Purchase priceThomas Shirt $40Maria Tennis shoes $35Evelyn Shirt

3、 $40Pajaro Trousers $25如果上面這個(gè)表用于保存物品的價(jià)格,而你想要?jiǎng)h除其中的一個(gè)顧客,這時(shí)你就必須同時(shí)刪 除一個(gè)價(jià)格。范化就是要解決這個(gè)問題,你可以將這個(gè)表化為兩個(gè)表,一個(gè)用于存儲(chǔ)每個(gè)顧 客和他所買物品的信息,另一個(gè)用于存儲(chǔ)每件產(chǎn)品和其價(jià)格的信息,這樣對其中一個(gè)表做添 加或刪除操作就不會(huì)影響另一個(gè)表。關(guān)系數(shù)據(jù)庫的幾種設(shè)計(jì)范式介紹1第一范式(1NF)在任何一個(gè)關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的基本要求,不滿足第一范式 (1NF)的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。所謂第一范式(1NF)是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有 多個(gè)值,即實(shí)體中的某個(gè)屬性

4、不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性, 就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對多 關(guān)系。在第一范式(1NF)中表的每一行只包含一個(gè)實(shí)例的信息。例如,對于圖3-2中的員 工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示; 員工信息表的每一行只表示一個(gè)員工的信息,一個(gè)員工的信息在表中只出現(xiàn)一次。簡而言之, 第一范式就是無重復(fù)的列。2第二范式(2NF)第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必 須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或行必須

5、可以被 惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。如圖3-2 員工信息表中加上了員工編號(emp_id)歹U,因?yàn)槊總€(gè)員工的員工編號是惟一的,因此每個(gè) 員工可以被惟一區(qū)分。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴 主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成 一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列, 以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。簡而言之,第二范式就是非主屬性非部分依賴于主關(guān)鍵字。3第三范式(3NF)滿足第三

6、范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一 個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門信息表, 其中每個(gè)部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在圖3-2的員工信 息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息 表中。如果不存在部門信息表,則根據(jù)第三范式GNF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的 數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。數(shù)據(jù)庫設(shè)計(jì)三大范式應(yīng)用實(shí)例剖析數(shù)據(jù)庫的設(shè)計(jì)范式是數(shù)據(jù)庫設(shè)計(jì)所需要滿足的規(guī)范,滿足這些規(guī)范的數(shù)據(jù)庫是簡潔的、結(jié)構(gòu) 明晰的,同時(shí)

7、,不會(huì)發(fā)生插入(insert)、刪除(delete)和更新(update)操作異常。反之 則是亂七八糟,不僅給數(shù)據(jù)庫的編程人員制造麻煩,而且面目可憎,可能存儲(chǔ)了大量不需要 的冗余信息。設(shè)計(jì)范式是不是很難懂呢?非也,大學(xué)教材上給我們一堆數(shù)學(xué)公式我們當(dāng)然看不懂,也記不 住。所以我們很多人就根本不按照范式來設(shè)計(jì)數(shù)據(jù)庫。實(shí)質(zhì)上,設(shè)計(jì)范式用很形象、很簡潔的話語就能說清楚,道明白。本文將對范式進(jìn)行通俗地 說明,并以筆者曾經(jīng)設(shè)計(jì)的一個(gè)簡單論壇的數(shù)據(jù)庫為例來講解怎樣將這些范式應(yīng)用于實(shí)際工 程。范式說明第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本類 型構(gòu)成,包括整型、實(shí)數(shù)、字

8、符型、邏輯型、日期型等。例如,如下的數(shù)據(jù)庫表是符合第一范式的:字段1字段2字段3字段4而這樣的數(shù)據(jù)庫表是不符合第一范式的:字段1字段2字段3字段4字段3.1字段3.2 很顯然,在當(dāng)前的任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,傻瓜也不可能做出不符合第一范 式的數(shù)據(jù)庫,因?yàn)檫@些DBMS不允許你把數(shù)據(jù)庫表的一列再分成二列或多列。因此,你想 在現(xiàn)有的DBMS中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫都是不可能的。第二范式(2NF):數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴(部 分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵 字段都完全依賴于任意一組候選關(guān)鍵字。假定

9、選課關(guān)系表為SelectCourse(學(xué)號,姓名,年齡,課程名稱,成績,學(xué)分),關(guān)鍵字為組合關(guān) 鍵字(學(xué)號,課程名稱),因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號,課程名稱)一(姓名,年齡,成績,學(xué)分)這個(gè)數(shù)據(jù)庫表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:(課程名稱)一(學(xué)分)(學(xué)號)一(姓名,年齡)即存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況。由于不符合2NF,這個(gè)選課關(guān)系表會(huì)存在如下問題:(1)數(shù)據(jù)冗余:同一門課程由n個(gè)學(xué)生選修,”學(xué)分”就重復(fù)n-1次;同一個(gè)學(xué)生選修了 m門課程,姓名和年 齡就重復(fù)了 m-1次。(2)更新異常:若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的”學(xué)分”值都要更新,否則會(huì)出現(xiàn)同一門課程學(xué)

10、 分不同的情況。(3)插入異常:假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒有人選修。這樣,由于還沒有學(xué)號”關(guān)鍵字,課程名稱 和學(xué)分也無法記錄入數(shù)據(jù)庫。(4)刪除異常:假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是,與此同 時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會(huì)導(dǎo)致插入異常。把選課關(guān)系表SelectCourse改為如下三個(gè)表:學(xué)生:Student(學(xué)號,姓名,年齡);課程:Course(課程名稱,學(xué)分);選課關(guān)系:SelectCourse(學(xué)號,課程名稱,成績)。這樣的數(shù)據(jù)庫表是符合第二范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。 另外,所有單關(guān)鍵字的數(shù)據(jù)庫表

11、都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候選關(guān)鍵 字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在A 一 B 一 C 的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫表應(yīng)該不存在如下依 賴關(guān)系:關(guān)鍵字段一非關(guān)鍵字段x一非關(guān)鍵字段y假定學(xué)生關(guān)系表為Student(學(xué)號,姓名,年齡,所在學(xué)院,學(xué)院地點(diǎn),學(xué)院電話),關(guān)鍵字為單 一關(guān)鍵字”學(xué)號”,因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號)一(姓名,年齡,所在學(xué)院,學(xué)院地點(diǎn),學(xué)院電話)這個(gè)數(shù)據(jù)庫是符合2NF的,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號)一

12、(所在學(xué)院)一(學(xué)院地點(diǎn),學(xué)院電話)即存在非關(guān)鍵字段”學(xué)院地點(diǎn)”、”學(xué)院電話”對關(guān)鍵字段”學(xué)號”的傳遞函數(shù)依賴。它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。把學(xué)生關(guān)系表分為如下兩個(gè)表:學(xué)生:(學(xué)號,姓名,年齡,所在學(xué)院);學(xué)院:(學(xué)院,地點(diǎn),電話)。這樣的數(shù)據(jù)庫表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。鮑依斯-科得范式(BCNF):在第三范式的基礎(chǔ)上,數(shù)據(jù)庫表中如果不存在任何字段對任一 候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。假設(shè)倉庫管理關(guān)系表為StorehouseManage(倉庫ID,存儲(chǔ)物品ID,管理員ID,數(shù)量),且有一 個(gè)管理

13、員只在一個(gè)倉庫工作;一個(gè)倉庫可以存儲(chǔ)多種物品。這個(gè)數(shù)據(jù)庫表中存在如下決定關(guān) 系:(倉庫ID,存儲(chǔ)物品ID)-(管理員ID,數(shù)量)(管理員ID,存儲(chǔ)物品ID)(倉庫ID,數(shù)量)所以,(倉庫ID,存儲(chǔ)物品ID)和(管理員ID,存儲(chǔ)物品ID)都是StorehouseManage的候選關(guān) 鍵字,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系: (倉庫ID)(管理員ID)(管理員ID)(倉庫ID)即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以其不符合BCNF范式。它會(huì)出現(xiàn)如下異常情況:(1)刪除異常:當(dāng)倉庫被清空后,所有”存儲(chǔ)物品ID和”數(shù)量”信息被刪除的同時(shí),倉庫ID和”管理員ID

14、 信息也被刪除了。(2)插入異常:當(dāng)倉庫沒有存儲(chǔ)任何物品時(shí),無法給倉庫分配管理員。(3)更新異常:如果倉庫換了管理員,則表中所有行的管理員ID都要修改。把倉庫管理關(guān)系表分解為二個(gè)關(guān)系表:倉庫管理:StorehouseManage(倉庫ID,管理員ID);倉庫:Storehouse(倉庫ID,存儲(chǔ)物品ID,數(shù)量)。這樣的數(shù)據(jù)庫表是符合BCNF范式的,消除了刪除異常、插入異常和更新異常。范式應(yīng)用我們來逐步搞定一個(gè)論壇的數(shù)據(jù)庫,有如下信息:(1)用戶:用戶名,email,主頁,電話,聯(lián)系地址(2)帖子:發(fā)帖標(biāo)題,發(fā)帖內(nèi)容,回復(fù)標(biāo)題,回復(fù)內(nèi)容第一次我們將數(shù)據(jù)庫設(shè)計(jì)為僅僅存在表:用戶名email主頁 電

15、話 聯(lián)系地址 發(fā)帖標(biāo)題 發(fā)帖內(nèi)容回復(fù)標(biāo)題回復(fù)內(nèi)容這個(gè)數(shù)據(jù)庫表符合第一范式,但是沒有任何一組候選關(guān)鍵字能決定數(shù)據(jù)庫表的整行,唯一的 關(guān)鍵字段用戶名也不能完全決定整個(gè)元組。我們需要增加”發(fā)帖ID”、”回復(fù)ID”字段,即將 表修改為:用戶名email主頁電話聯(lián)系地址發(fā)帖ID發(fā)帖標(biāo)題發(fā)帖內(nèi)容回復(fù)ID回復(fù)標(biāo)題回復(fù) 內(nèi)容這樣數(shù)據(jù)表中的關(guān)鍵字(用戶名,發(fā)帖ID,回復(fù)ID)能決定整行:(用戶名,發(fā)帖ID,回復(fù)ID) 一 (email,主頁,電話,聯(lián)系地址,發(fā)帖標(biāo)題,發(fā)帖內(nèi)容,回復(fù)標(biāo)題,回復(fù)內(nèi) 容)但是,這樣的設(shè)計(jì)不符合第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:(用戶名)一 (email,主頁,電話,聯(lián)系地址)(發(fā)帖ID

16、) 一 (發(fā)帖標(biāo)題,發(fā)帖內(nèi)容)(回復(fù)ID) 一(回復(fù)標(biāo)題,回復(fù)內(nèi)容)即非關(guān)鍵字段部分函數(shù)依賴于候選關(guān)鍵字段,很明顯,這個(gè)設(shè)計(jì)會(huì)導(dǎo)致大量的數(shù)據(jù)冗余和操 作異常。我們將數(shù)據(jù)庫表分解為(帶下劃線的為關(guān)鍵字):(1)用戶信息:用戶名,email,主頁,電話,聯(lián)系地址(2)帖子信息:發(fā)帖ID,標(biāo)題,內(nèi)容(3)回復(fù)信息:回復(fù)ID,標(biāo)題,內(nèi)容(4)發(fā)貼:用戶名,發(fā)帖ID(5)回復(fù):發(fā)帖ID,回復(fù)ID這樣的設(shè)計(jì)是滿足第1、2、3范式和BCNF范式要求的,但是這樣的設(shè)計(jì)是不是最好的呢? 不一定。觀察可知,第4項(xiàng)”發(fā)帖”中的”用戶名”和發(fā)帖ID”之間是1: N的關(guān)系,因此我們可以把” 發(fā)帖”合并到第2項(xiàng)的帖子信息

17、”中;第5項(xiàng)”回復(fù)”中的”發(fā)帖ID”和”回復(fù)ID”之間也是1: N 的關(guān)系,因此我們可以把”回復(fù)”合并到第3項(xiàng)的”回復(fù)信息”中。這樣可以一定量地減少數(shù)據(jù) 冗余,新的設(shè)計(jì)為:用戶信息:用戶名,email,主頁,電話,聯(lián)系地址帖子信息:用戶名,發(fā)帖ID,標(biāo)題,內(nèi)容回復(fù)信息:發(fā)帖ID,回復(fù)ID,標(biāo)題,內(nèi)容數(shù)據(jù)庫表1顯然滿足所有范式的要求;數(shù)據(jù)庫表2中存在非關(guān)鍵字“標(biāo)題”、“內(nèi)容”對關(guān)鍵字段“發(fā)帖ID”的部分函數(shù)依賴,即不滿足 第二范式的要求,但是這一設(shè)計(jì)并不會(huì)導(dǎo)致數(shù)據(jù)冗余和操作異常;數(shù)據(jù)庫表3中也存在非關(guān)鍵字段”標(biāo)題、內(nèi)容”對關(guān)鍵字段”回復(fù)ID”的部分函數(shù)依賴,也不 滿足第二范式的要求,但是與數(shù)據(jù)庫

18、表2相似,這一設(shè)計(jì)也不會(huì)導(dǎo)致數(shù)據(jù)冗余和操作異常。由此可以看出,并不一定要強(qiáng)行滿足范式的要求,對于1: N關(guān)系,當(dāng)1的一邊合并到N的 那邊后,N的那邊就不再滿足第二范式了,但是這種設(shè)計(jì)反而比較好!對于M: N的關(guān)系,不能將M 一邊或N 一邊合并到另一邊去,這樣會(huì)導(dǎo)致不符合范式要求, 同時(shí)導(dǎo)致操作異常和數(shù)據(jù)冗余。對于1: 1的關(guān)系,我們可以將左邊的1或者右邊的1合并到另一邊去,設(shè)計(jì)導(dǎo)致不符合范 式要求,但是并不會(huì)導(dǎo)致操作異常和數(shù)據(jù)冗余。結(jié)論滿足范式要求的數(shù)據(jù)庫設(shè)計(jì)是結(jié)構(gòu)清晰的,同時(shí)可避免數(shù)據(jù)冗余和操作異常。這并意味著不 符合范式要求的設(shè)計(jì)一定是錯(cuò)誤的,在數(shù)據(jù)庫表中存在1: 1或1: N關(guān)系這種較特

19、殊的情 況下,合并導(dǎo)致的不符合范式要求反而是合理的。在我們設(shè)計(jì)數(shù)據(jù)庫的時(shí)候,一定要時(shí)刻考慮范式的要求。1NF: 一個(gè)table中的列是不可再分的(即列的原子性)2NF: 一個(gè)table中的行是可以唯一標(biāo)示的,(即table中的行是不可以有重復(fù) 的)3NF: 一個(gè)table中列不依賴以另一個(gè)table中的非主鍵的列,還是不通俗!巨 寒!舉個(gè)例子吧:有一個(gè)部門的table,我們叫它tbl_department,它有這么幾列 (dept_id(pk),dept_name,dept_memo.)有一個(gè)員工table,我們叫它tbl_employee,在這個(gè)table中有一列dept_id(fk) 描述

20、關(guān)于部門的信息,若tbl_employee要滿足3NF,則在tbl_employee中就不得再有除dept_id列的其它有關(guān)部門信息的列!一般數(shù)據(jù)庫的設(shè)計(jì)滿足3NF即可?。▊€(gè)人覺得應(yīng)該盡可能的滿足3NF,一家之言 )BCNF:通常認(rèn)為BCNF是修正的第三范式,它比3NF又進(jìn)一步!4NF:5NF:將一個(gè)table盡可能的分割成小的塊,以排除在table中所有冗余的數(shù)據(jù)范式簡介為了回答上述問題,了解3NF、BCNF、4NF和5NF之間的區(qū)別很重要。以下為每 個(gè)范式的準(zhǔn)確定義。第一范式(1NF)每個(gè)表必須有一個(gè)首要鍵,即最少的一組屬性,它與每條記錄一一對應(yīng)。通過適 當(dāng)定義鍵屬性和非鍵屬性,刪除重復(fù)的

21、組(不同記錄似乎需要不同次重復(fù)的數(shù)據(jù) 種類)。注:每個(gè)屬性必須包含單獨(dú)一個(gè)值,而非一組值。第二范式(2NF)數(shù)據(jù)庫必須滿足1NF的所有要求。另外,如果一個(gè)表有一個(gè)復(fù)合鍵,所有屬性必 須與整個(gè)鍵相關(guān)聯(lián)。而且,在表的多行之間多余重復(fù)的數(shù)據(jù)被移動(dòng)一個(gè)單獨(dú)的表 中。第三范式(3NF) 存儲(chǔ)在表中的數(shù)據(jù)不得依賴表的任何域,必須唯一依賴于首要鍵。數(shù)據(jù)庫必須滿 足2NF的所有要求。既依賴首要鍵,又依賴其它域的數(shù)據(jù)被移動(dòng)到一個(gè)單獨(dú)的表 中。Boyce-Codd 范式(BCNF)除對一個(gè)候選鍵擴(kuò)展集(稱作一個(gè)超級鍵)存在屬性函數(shù)依賴外,不存在其它非平 凡函數(shù)依賴。第四范式(4NF)除對一個(gè)候選鍵擴(kuò)展集存在屬性組

22、函數(shù)依賴外,不存在其它非平凡多值函數(shù)依 賴。如果且只有一個(gè)表符合BCNF,同時(shí)多值依賴為函數(shù)依賴,此表才符合第四 范式。4NF刪除了不必要的數(shù)據(jù)結(jié)構(gòu):多值依賴。第五范式(5NF)不得存在不遵循鍵約束的非平凡連接依賴。如果且只有一個(gè)表符合4NF,同時(shí)其 中的每個(gè)連接依賴被候選鍵所包含,此表才符合第五依賴。數(shù)據(jù)庫范式注:表在定義中被稱為關(guān)系,記作R字段在定義中被稱作屬性模式:數(shù)據(jù)庫中有三種模式,外模式,內(nèi)模式,模式粗體是關(guān)鍵字的意思斜體為外鍵第一范式定義:如果關(guān)系R中所有屬性的值域都是單純域,那么關(guān)系模式R是第一范式 的那么符合第一模式的特點(diǎn)就有1)有主關(guān)鍵字2)主鍵不能為空,3)主鍵不能重復(fù),4

23、)字段不可以再分例如:StudyNo | Name | Sex | Contact20040901 john Male Email:,phone:22245620040901 mary famale email: HYPERLINK mailto: phone:123455以上的表就不符合,第一范式:主鍵重復(fù)(實(shí)際中數(shù)據(jù)庫不允許重復(fù)的),而且Contact字段可以再分所以變更為正確的是StudyNo | Name | Sex | Email | Phone20040901 john Male HYPERLINK mailto: 22245620040902 mary famale HYPERL

24、INK mailto: 123455 第二范式:定義:如果關(guān)系模式R是第一范式的,而且關(guān)系中每一個(gè)非主屬性不部分依賴于 主鍵,稱R是第二范式的。所以第二范式的主要任務(wù)就是滿足第一范式的前提下,消除部分函數(shù)依賴。StudyNo | Name | Sex | Email | Phone | ClassNo| ClassAddress 01 john Male HYPERLINK mailto: 222456 200401 A 樓 2 01 mary famale HYPERLINK mailto: 123455 200402 A 樓 3 這個(gè)表完全滿足于第一范式,主鍵由StudyNo和ClassN

25、o組成,這樣才能定位到指定行但是,ClassAddress 部分依賴于關(guān)鍵字(ClassNo-ClassAddress), 所以要變?yōu)閮蓚€(gè)表表一StudyNo | Name | Sex | Email | Phone | ClassNo 01 john Male HYPERLINK mailto: 222456 200401 01 mary famale HYPERLINK mailto: 123455 200402 表二ClassNo | ClassAddress200401 A 樓 2200402 A 樓 3第三范式:滿足第二范式的前提下,消除傳遞依賴。例:StudyNo | Name |

26、 Sex | Email | bounsLevel | bouns 20040901 john Male HYPERLINK mailto: 優(yōu)秀 $1000 20040902 mary famale HYPERLINK mailto: 良 $600這個(gè)完全滿足了第二范式,但是bounsLevel和bouns存在傳遞依賴 更改為:StudyNo | Name | Sex | Email | bouunsNo 20040901 john Male HYPERLINK mailto: 1 20040902 mary famale HYPERLINK mailto: 2 bounsNo | boun

27、sLevel | bouns 1優(yōu)秀$1000 2 良 $600 這里我比較喜歡用bounsNo作為主鍵, 基于兩個(gè)原因不要用字符作為主鍵??赡苡腥苏f:如果我的等級一開始就用數(shù)值就代替呢?但是如果等級名稱更改了,不叫1,2,3或優(yōu)、良,這樣就可以方便更改, 所以我一般優(yōu)先使用與業(yè)務(wù)無關(guān)的字段作為關(guān)鍵字。一般滿足前三個(gè)范式就可以避免數(shù)據(jù)冗余。第四范式:主要任務(wù):滿足第三范式的前提下,消除多值依賴 product | agent | factory Car A1 F1 Bus A1 F2 Car A2 F2在這里,Car的定位,必須由agent和Factory才能得到(所以主鍵由agent 和fa

28、ctory組成),可以通過product依賴了 agent和factory兩個(gè)屬性 所以正確的是 表1表2: product | agent factory | product Car A1 F1 Car Bus A1 F2 Car Car A2 F2 Bus第五范式:定義:如果關(guān)系模式R中的每一個(gè)連接依賴,都是由R的候選鍵所蘊(yùn)含,稱R 是第五范式的看到定義,就知道是要消除連接依賴,并且必須保證數(shù)據(jù)完整 例子 A | B | C a1 b1 c1 a2 b1 c2 a1 b2 c1 a2 b2 c2如果要定位到特定行,必須三個(gè)屬性都為關(guān)鍵字。所以關(guān)系要變?yōu)?三個(gè)關(guān)系,分別是A和B,B和C,C和

29、A 如下:表1表2表3A | B B | C C | A a1 b1 b1 c1 c1 a1 a1 b2 b1 c2 c1 a2范式可以避免數(shù)據(jù)冗余,減少數(shù)據(jù)庫的空間,減輕維護(hù)數(shù)據(jù)完整性的麻煩,但是 操作難,因?yàn)樾枰?lián)系多個(gè)表才能得到所需要數(shù)據(jù),而且越高范式性能就會(huì)越差。 要權(quán)衡是否使用更高范式是比較麻煩。一般我在做項(xiàng)目中都,用得最多的也就是第三范式,我認(rèn)為使用到第三范式也就 足夠了,性能好 而且方便管理數(shù)據(jù)I、關(guān)系數(shù)據(jù)庫設(shè)計(jì)范式介紹1.1第一范式(1NF)無重復(fù)的列 所謂第一范式(1NF )是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一 列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或

30、者不能有重復(fù)的屬性。 如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu) 成,新實(shí)體與原實(shí)體之間為一對多關(guān)系。在第一范式(1NF)中表的每一行只包 含一個(gè)實(shí)例的信息。簡而言之,第一范式就是無重復(fù)的列。說明:在任何一個(gè)關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的基本要求, 不滿足第一范式(1NF)的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。1.2第二范式(2NF)屬性完全依賴于主鍵第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF) 必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或行 必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一

31、個(gè)列,以存儲(chǔ)各個(gè)實(shí)例 的惟一標(biāo)識(shí)。例如員工信息表中加上了員工編號(emp_id)列,因?yàn)槊總€(gè)員工的 員工編號是惟一的,因此每個(gè)員工可以被惟一區(qū)分。這個(gè)惟一屬性列被稱為主關(guān) 鍵字或主鍵、主碼。第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能 存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一 部分應(yīng)該分離出來形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系。為 實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。簡而言之,第 二范式就是屬性完全依賴于主鍵。3第三范式(3NF)屬性不依賴于其它非主屬性滿足第三范式(3NF)必須先滿足第二范式(2N

32、F)。簡而言之,第三范式(3NF) 要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在 一個(gè)部門信息表,其中每個(gè)部門有部門編號(dept_id)、部門名稱、部門簡介 等信息。那么在的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介 等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三 范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。簡而言之,第三范式 就是屬性不依賴于其它非主屬性。II、范式應(yīng)用實(shí)例剖析下面以一個(gè)學(xué)校的學(xué)生系統(tǒng)為例分析說明,這幾個(gè)范式的應(yīng)用。首先第一范式 (1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本

33、類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。在當(dāng)前的任何關(guān)系數(shù) 據(jù)庫管理系統(tǒng)(DBMS)中,傻瓜也不可能做出不符合第一范式的數(shù)據(jù)庫,因?yàn)檫@ 些DBMS不允許你把數(shù)據(jù)庫表的一列再分成二列或多列。因此,你想在現(xiàn)有的DBMS 中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫都是不可能的。首先我們確定一下要設(shè)計(jì)的內(nèi)容包括那些。學(xué)號、學(xué)生姓名、年齡、性別、課程、 課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話等信息。為了簡單我們暫時(shí)只 考慮這些字段信息。我們對于這些信息,說關(guān)心的問題有如下幾個(gè)方面。學(xué)生有那些基本信息學(xué)生選了那些課,成績是什么每個(gè)課的學(xué)分是多少學(xué)生屬于那個(gè)系,系的基本信息是什么。2.1第二范式(2N

34、F)實(shí)例分析首先我們考慮,把所有這些信息放到一個(gè)表中(學(xué)號,學(xué)生姓名、年齡、性別、 課程、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話)下面存在如下的依賴 關(guān)系。(學(xué)號)一(姓名,年齡,性別,系別,系辦地址、系辦電話)(課程名稱)-(學(xué)分)(學(xué)號,課程)一(學(xué)科成績)2.1. 1問題分析因此不滿足第二范式的要求,會(huì)產(chǎn)生如下問題數(shù)據(jù)冗余:同一門課程由n個(gè)學(xué)生選修,學(xué)分就重復(fù)n-1次;同一個(gè)學(xué)生選 修了 m門課程,姓名和年齡就重復(fù)了 m-1次。更新異常:1)若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的學(xué)分值都要更新,否則會(huì)出現(xiàn) 同一門課程學(xué)分不同的情況。2)假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒有人選修。這

35、樣,由于還沒有學(xué)號關(guān)鍵 字,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。刪除異常:假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫 表中刪除。但是,與此同時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會(huì) 導(dǎo)致插入異常。2.1.2解決方案把選課關(guān)系表SelectCourse改為如下三個(gè)表:學(xué)生:Student(學(xué)號,姓名,年齡,性別,系別,系辦地址、系辦電話);課程:Course(課程名稱,學(xué)分);選課關(guān)系:SelectCourse(學(xué)號,課程名稱,成績)。2.2第三范式(3NF)實(shí)例分析 接著看上面的學(xué)生表Student(學(xué)號,姓名,年齡,性別,系別,系辦地址、系 辦電話),關(guān)鍵字為單一關(guān)鍵字

36、學(xué)號,因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號)f (姓名,年齡,性別,系別,系辦地址、系辦電話)但是還存在下面的決定關(guān)系(學(xué)號)f (所在學(xué)院)f(學(xué)院地點(diǎn),學(xué)院電話)即存在非關(guān)鍵字段學(xué)院地點(diǎn)、學(xué)院電話對關(guān)鍵字段學(xué)號的傳遞函數(shù)依賴。 它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況。(敷披的更新, 刪除巽常逼里就不分析了,可以參照2.1.1逵行分析)根據(jù)第三范式把學(xué)生關(guān)系表分為如下兩個(gè)表就可以滿足第三范式了:學(xué)生:(學(xué)號,姓名,年齡,性別,系別);系別:(系別,系辦地址、系辦電話)??偨Y(jié)上面的數(shù)據(jù)庫表就是符合I,II,III范式的,消除了數(shù)據(jù)冗余、更新異常、插入 異常和刪除異常。數(shù)據(jù)庫設(shè)計(jì)范式深入

37、淺出關(guān)系數(shù)據(jù)庫設(shè)計(jì)之時(shí)是要遵守一定的規(guī)則的。尤其是數(shù)據(jù)庫設(shè)計(jì)范式 現(xiàn)簡單介 紹1NF (第一范式),2NF (第二范式),3NF (第三范式)和BCNF,另有第四范 式和第五范式留到以后再介紹。在你設(shè)計(jì)數(shù)據(jù)庫之時(shí),若能符合這幾個(gè)范式, 你就是數(shù)據(jù)庫設(shè)計(jì)的高于。第一范式(1NF):在關(guān)系模式R中的每一個(gè)具體關(guān)系r中,如果每個(gè)屬性值都 是不可再分的最小數(shù)據(jù)單位,則稱R是第一范式的關(guān)系。例:如職工號,姓名, 電話號碼組成一個(gè)表(一個(gè)人可能有一個(gè)辦公室電話 和一個(gè)家里電話號碼)規(guī) 范成為1NF有三種方法:一是重復(fù)存儲(chǔ)職工號和姓名。這樣,關(guān)鍵字只能是電話號碼。二是職工號為關(guān)鍵字,電話號碼分為單位電話和住

38、宅電話兩個(gè)屬性三是職工號為關(guān)鍵字,但強(qiáng)制每條記錄只能有一個(gè)電話號碼。以上三個(gè)方法,第一種方法最不可取,按實(shí)際情況選取后兩種情況。第二范式(2NF):如果關(guān)系模式R (U,F(xiàn))中的所有非主屬性都完全依賴于任 意一個(gè)候選關(guān)鍵字,則稱關(guān)系R是屬于第二范式的。例:選課關(guān)系SCI (SNO,CNO,GRADE,CREDIT)其中SNO為學(xué)號,CNO為課程 號,GRADEGE為成績,CREDIT為學(xué)分。由以上條件,關(guān)鍵字為組合關(guān)鍵字(SNO, CNO)在應(yīng)用中使用以上關(guān)系模式有以下問題:數(shù)據(jù)冗余,假設(shè)同一門課由40個(gè)學(xué)生選修,學(xué)分就 重復(fù)40次。段更新異常,若調(diào)整了某課程的學(xué)分,相應(yīng)的元組CREDIT值都

39、要更新,有可能 會(huì)出現(xiàn)同一門課學(xué)分不同。插入異常,如計(jì)劃開新課,由于沒人選修,沒有學(xué)號關(guān)鍵字,只能等有人選修 才能把課程和學(xué)分存入。d.刪除異常,若學(xué)生已經(jīng)結(jié)業(yè),從當(dāng)前數(shù)據(jù)庫刪除選修記錄。某些門課程新生尚 未選修,則此門課程及學(xué)分記錄無法保存。原因:非關(guān)鍵字屬性CREDIT僅函數(shù)依賴于CNO,也就是CREDIT部分依賴組合關(guān) 鍵字(SNO,CNO)而不是完全依賴。解決方法:分成兩個(gè)關(guān)系模式SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。 新關(guān)系包括兩個(gè)關(guān)系模式,它們之間通過SC1中的外關(guān)鍵字CNO相聯(lián)系,需要時(shí) 再進(jìn)行自然聯(lián)接,恢復(fù)了原來的關(guān)系第三范式(3NF):如果關(guān)系模

40、式R(U,F(xiàn))中的所有非主屬性對任何候選關(guān)鍵 字都不存在傳遞信賴,則稱關(guān)系R是屬于第三范式的。例:如 S1(SNO,SNAME,DNO,DNAME,LOCATION)各屬性分別代表學(xué)號,姓名,所在系,系名稱,系地址。關(guān)鍵字SNO決定各個(gè)屬性。由于是單個(gè)關(guān)鍵字,沒有部分依賴的問題,肯定是 2NF。但這關(guān)系肯定有大量的冗余,有關(guān)學(xué)生所在的幾個(gè)屬性DNO, DNAME, LOCATION將重復(fù)存儲(chǔ),插入,刪除和修改時(shí)也將產(chǎn)生類似以上例的情況。原因:關(guān)系中存在傳遞依賴造成的。即SNO - DNO。而DNO - SNO卻不存在, DNO - LOCATION,因此關(guān)鍵遼SNO對LOCATION函數(shù)決定是

41、通過傳遞依賴SNO - LOCATION實(shí)現(xiàn)的。也就是說,SNO不直接決定非主屬性LOCATIONo解決目地:每個(gè)關(guān)系模式中不能留有傳遞依賴。解決方法:分為兩個(gè)關(guān)系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)注意:關(guān)系S中不能沒有外關(guān)鍵字DNO。否則兩個(gè)關(guān)系之間失去聯(lián)系。BCNF:如果關(guān)系模式R(U,F(xiàn))的所有屬性(包括主屬性和非主屬性)都不傳遞 依賴于R的任何候選關(guān)鍵字,那么稱關(guān)系R是屬于BCNF的?;蚴顷P(guān)系模式R, 如果每個(gè)決定因素都包含關(guān)鍵字(而不是被關(guān)鍵字所包含),則RCNF的關(guān)系模 式。例:配件管理關(guān)系模式WPE (WNO, PNO, ENO, QN

42、T)分別表倉庫號,配件號,職 工號,數(shù)量。有以下條件一個(gè)倉庫有多個(gè)職工。一個(gè)職工僅在一個(gè)倉庫工作。每個(gè)倉庫里一種型號的配件由專人負(fù)責(zé),但一個(gè)人可以管理幾種配件。同一種型號的配件可以分放在幾個(gè)倉庫中。分析:由以上得PNO不能確定QNT,由組合屬性(WNO, PNO)來決定,存在函 數(shù)依賴(WNO, PNO)- ENO。由于每個(gè)倉庫里的一種配件由專人負(fù)責(zé),而一個(gè) 人可以管理幾種配件,所以有組合屬性(WNO, PNO)才能確定負(fù)責(zé)人,有(WNO, PNO)- ENO。因?yàn)?一個(gè)職工僅在一個(gè)倉庫工作,有ENO - WNO。由于每個(gè)倉 庫里的一種配件由專人負(fù)責(zé),而一個(gè)職工僅在一個(gè)倉庫工作,有(ENO,

43、PNO) - QNT。找一下候選關(guān)鍵字,因?yàn)椋╓NO, PNO)-QNT,(WNO, PNO)- ENO,因此(WNO, PNO)可以決定整個(gè)元組,是一個(gè)候選關(guān)鍵字。根據(jù)ENO-WNO,(ENO, PNO)-QNT, 故(ENO, PNO)也能決定整個(gè)元組,為另一個(gè)候選關(guān)鍵字。屬性ENO, WNO, PNO 均為主屬性,只有一個(gè)非主屬性QNT。它對任何一個(gè)候選關(guān)鍵字都是完全函數(shù)依 賴的,并且是直接依賴,所以該關(guān)系模式是3NF。分析一下主屬性。因?yàn)镋NO-WNO,主屬性ENO是WNO的決定因素,但是它本身 不是關(guān)鍵字,只是組合關(guān)鍵字的一部分。這就造成主屬性WNO對另外一個(gè)候選關(guān) 鍵字(ENO,P

44、NO)的部 分依賴,因?yàn)椋‥NO,PNO)- ENO但反過來不成立,而 P-WNO,故(ENO, PNO)- WNO 也是傳遞依賴。雖然沒有非主屬性對候選關(guān)鍵遼的傳遞依賴,但存在主屬性對候選關(guān)鍵字的傳遞 依賴,同樣也會(huì)帶來麻煩。如一個(gè)新職工分配到倉庫工作,但暫時(shí)處于實(shí)習(xí)階段, 沒有獨(dú)立負(fù)責(zé)對某些配件的管理任務(wù)。由于缺少關(guān)鍵字的一部分PNO而無法插入 到該關(guān)系中去。又如某個(gè)人改成不管配件了去負(fù)責(zé)安全,則在刪除配件的同時(shí)該 職工也會(huì)被刪除。解決辦法:分成管理EP(ENO, PNO, QNT),關(guān)鍵字是(ENO, PNO)工作EW(ENO, WNO)其關(guān)鍵字是ENO缺點(diǎn):分解后函數(shù)依賴的保持性較差。

45、如此例中,由于分解,函數(shù)依賴(WNO, PNO) - ENO丟失了,因而對原來的語義有所破壞。沒有體現(xiàn)出每個(gè)倉庫里一種部件 由專人負(fù)責(zé)。有可能出現(xiàn)一部件由兩個(gè)人或兩個(gè)以上的人來同時(shí)管理。因此, 分解之后的關(guān)系模式降低了部分完整性約束。一個(gè)關(guān)系分解成多個(gè)關(guān)系,要使得分解有意義,起碼的要求是分解后不丟失原來 的信息。這些信息不僅包括數(shù)據(jù)本身,而且包括由函數(shù)依賴所表示的數(shù)據(jù)之間的 相互制約。進(jìn)行分解的目標(biāo)是達(dá)到更高一級的規(guī)范化程度,但是分解的同時(shí)必須 考慮兩個(gè)問題:無損聯(lián)接性和保持函數(shù)依賴。有時(shí)往往不可能做到既有無損聯(lián)接 性,又完全保持函數(shù)依賴。需要根據(jù)需要進(jìn)行權(quán)衡。1NF直到BCNF的四種范式之間

46、有如下關(guān)系:BCNF包含了 3NF包含2NF包含1NF小結(jié):目地:規(guī)范化目的是使結(jié)構(gòu)更合理,消除存儲(chǔ)異常,使數(shù)據(jù)冗余盡量小,便于插 入、刪除和更新原則:遵從概念單一化一事一地原則,即一個(gè)關(guān)系模式描述一個(gè)實(shí)體或?qū)嶓w 間的一種聯(lián)系。規(guī)范的實(shí)質(zhì)就是概念的單一化。方法:將關(guān)系模式投影分解成兩個(gè)或兩個(gè)以上的關(guān)系模式。要求:分解后的關(guān)系模式集合應(yīng)當(dāng)與原關(guān)系模式等價(jià),即經(jīng)過自然聯(lián)接可以恢 復(fù)原關(guān)系而不丟失信息,并保持屬性間合理的聯(lián)系。注意:一個(gè)關(guān)系模式結(jié)這分解可以得到不同關(guān)系模式集合,也就是說分解方法不 是唯一的。最小冗余的要求必須以分解后的數(shù)據(jù)庫能夠表達(dá)原來數(shù)據(jù)庫所有信息 為前提來實(shí)現(xiàn)。其根本目標(biāo)是節(jié)省存

47、儲(chǔ)空間,避免數(shù)據(jù)不一致性,提高對關(guān)系的 操作效率,同時(shí)滿足應(yīng)用需求。實(shí)際上,并不一定要求全部模式都達(dá)到BCNF不 可。有時(shí)故意保留部分冗余可能更方便數(shù)據(jù)查詢。尤其對于那些更新頻度不高, 查詢頻度極高的數(shù)據(jù)庫系統(tǒng)更是如此。在關(guān)系數(shù)據(jù)庫中,除了函數(shù)依賴之外還有多值依賴,聯(lián)接依賴的問題,從而提出 了第四范式,第五范式等更高一級的規(guī)范化要求。在此,以后再談。各位朋友,你看過后有何感想,其實(shí),任何一本數(shù)據(jù)庫基礎(chǔ)理論的書都會(huì)講這些 東西,考慮到很多網(wǎng)友是半途出家,來做數(shù)據(jù)庫。特找一本書大抄特抄一把,各 位有什么問題,也別問我了,自已去找一本關(guān)系數(shù)據(jù)庫理論的書去看吧,說不定, 對各位大有幫助。說是說以上是基

48、礎(chǔ)理論的東西,請大家想想,你在做數(shù)據(jù)庫設(shè) 計(jì)的時(shí)候有沒有考慮過遵過以上幾個(gè)范式呢,有沒有在數(shù)據(jù)庫設(shè)計(jì)做得不好之 時(shí),想一想,對比以上所講,到底是違反了第幾個(gè)范式呢?我見過的數(shù)據(jù)庫設(shè)計(jì),很少有人做到很符合以上幾個(gè)范式的,一般說來,第一范 式大家都可以遵守,完全遵守第二第三范式的人很少了,遵守的人一定就是設(shè)計(jì) 數(shù)據(jù)庫的高于了,BCNF的范式出現(xiàn)機(jī)會(huì)較少,而且會(huì)破壞完整性,你可以在做 設(shè)計(jì)之時(shí)不考慮它,當(dāng)然在ORACLE中可通過觸發(fā)器解決其缺點(diǎn)。以后我們共同 做設(shè)計(jì)之時(shí),也希望大家遵守以上幾個(gè)范式。3簡潔、明晰!數(shù)據(jù)庫設(shè)計(jì)三大范式應(yīng)用實(shí)例剖析2006.12.30共有評論(12)條發(fā)表評論收藏第二范式

49、(2NF):數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依 賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所 有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。關(guān)鍵以蜀引言數(shù)據(jù)庫的設(shè)計(jì)范式是數(shù)據(jù)庫設(shè)計(jì)所需要滿足的規(guī)范,滿足這些規(guī)范的數(shù)據(jù)庫是簡潔 的、結(jié)構(gòu)明晰的,同時(shí),不會(huì)發(fā)生插入(insert)、刪除(delete)和更新(update)操 作異常。反之則是亂七八糟,不僅給數(shù)據(jù)庫的編程人員制造麻煩,而且面目可憎,可能 存儲(chǔ)了大量不需要的冗余信息。設(shè)計(jì)范式是不是很難懂呢?非也,大學(xué)教材上給我們一堆數(shù)學(xué)公式我們當(dāng)然看不懂, 也記不住。所以我們很多人就根本不按照范式

50、來設(shè)計(jì)數(shù)據(jù)庫。實(shí)質(zhì)上,設(shè)計(jì)范式用很形象、很簡潔的話語就能說清楚,道明白。本文將對范式進(jìn) 行通俗地說明,并以筆者曾經(jīng)設(shè)計(jì)的一個(gè)簡單論壇的數(shù)據(jù)庫為例來講解怎樣將這些范式 應(yīng)用于實(shí)際工程。范式說明第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由 基本類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。例如,如下的數(shù)據(jù)庫表是符合第一范式的:字段1字段2字段3字段4而這樣的數(shù)據(jù)庫表是不符合第一范式的:字段1字段2字段3字段4字段3.1字段3.2很顯然,在當(dāng)前的任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS )中,傻瓜也不可能做出不符 合第一范式的數(shù)據(jù)庫,因?yàn)檫@些DBMS不允許你把數(shù)據(jù)庫表的

51、一列再分成二列或多列。 因此,你想在現(xiàn)有的DBMS中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫都是不可能的。第二范式(2NF):數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依 賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所 有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。假定選課關(guān)系表為SelectCourse(學(xué)號,姓名,年齡,課程名稱,成績,學(xué)分),關(guān) 鍵字為組合關(guān)鍵字(學(xué)號,課程名稱),因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號,課程名稱)一(姓名,年齡,成績,學(xué)分)這個(gè)數(shù)據(jù)庫表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:(課程名稱)一(學(xué)分)(學(xué)號)一(姓名,年齡)即存在組合關(guān)鍵字

52、中的字段決定非關(guān)鍵字的情況。由于不符合2NF,這個(gè)選課關(guān)系表會(huì)存在如下問題:(1)數(shù)據(jù)冗余:同一門課程由n個(gè)學(xué)生選修,學(xué)分”就重復(fù)n-1次;同一個(gè)學(xué)生選修了 m門課程, 姓名和年齡就重復(fù)了 m-1次。(2)更新異常:若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的學(xué)分”值都要更新,否則會(huì)出現(xiàn)同一 門課程學(xué)分不同的情況。(3)插入異常:假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒有人選修。這樣,由于還沒有學(xué)號”關(guān)鍵字, 課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。(4)刪除異常:假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是, 與此同時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會(huì)導(dǎo)致插入異常。把選

53、課關(guān)系表SelectCourse改為如下三個(gè)表:學(xué)生:Student(學(xué)號,姓名,年齡);課程:Course(課程名稱,學(xué)分);選課關(guān)系:SelectCourse(學(xué)號,課程名稱,成績)。這樣的數(shù)據(jù)庫表是符合第二范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除 異常。另外,所有單關(guān)鍵字的數(shù)據(jù)庫表都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候 選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在入一 B 一 C”的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫表應(yīng)該不 存在如下依賴關(guān)系:關(guān)鍵字

54、段一非關(guān)鍵字段x 一非關(guān)鍵字段y假定學(xué)生關(guān)系表為Student(學(xué)號,姓名,年齡,所在學(xué)院,學(xué)院地點(diǎn),學(xué)院電話), 關(guān)鍵字為單一關(guān)鍵字”學(xué)號”,因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號)一(姓名,年齡,所在學(xué)院,學(xué)院地點(diǎn),學(xué)院電話)這個(gè)數(shù)據(jù)庫是符合2NF的,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:(學(xué)號)一(所在學(xué)院)一(學(xué)院地點(diǎn),學(xué)院電話)即存在非關(guān)鍵字段”學(xué)院地點(diǎn)”、學(xué)院電話”對關(guān)鍵字段”學(xué)號”的傳遞函數(shù)依賴。它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況,讀者可自行分析得 知。把學(xué)生關(guān)系表分為如下兩個(gè)表:學(xué)生:(學(xué)號,姓名,年齡,所在學(xué)院);學(xué)院:(學(xué)院,地點(diǎn),電話)。這樣的數(shù)據(jù)庫表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除 異常。鮑依斯-科得范式(BCNF):在第三范式的基礎(chǔ)上,數(shù)據(jù)庫表中如果不存在任何字段 對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。假設(shè)倉庫管理關(guān)系表為StorehouseManage(倉庫ID,存儲(chǔ)物品ID,管理員ID, 數(shù)量),且有一個(gè)管理員只在一個(gè)倉庫工作;一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論