电竞比分网-中国电竞赛事及体育赛事平台

分享

數(shù)據(jù)庫范式 相關(guān)復(fù)習(xí)

 燮羽 2010-11-14
東西很多 要慢慢看。。大概整合了三篇文章

設(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),其余范式以次類推。一般說來,數(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ù)據(jù)庫中的數(shù)據(jù)元素、關(guān)系,以及定義所需的表和各表中的項(xiàng)目這些初始工作之后的一個(gè)細(xì)化的過程。

下面是范化的一個(gè)例子  

Customer   Item purchased    Purchase price   

Thomas    Shirt        $40   

Maria Tennis  shoes            $35    

Evelyn    Shirt                                           $40  

Pajaro      Trousers              $25   
如果上面這個(gè)表用于保存物品的價(jià)格,而你想要刪除其中的一個(gè)顧客,這時(shí)你就必須同時(shí)刪除一個(gè)價(jià)格。范化就是要解決這個(gè)問題,你可以將這個(gè)表化為兩個(gè)表,一個(gè)用于存儲每個(gè)顧客和他所買物品的信息,另一個(gè)用于存儲每件產(chǎn)品和其價(jià)格的信息,這樣對其中一個(gè)表做添加或刪除操作就不會影響另一個(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è)屬性不能有多個(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í)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲各個(gè)實(shí)例的惟一標(biāo)識。如圖3-2 員工信息表中加上了員工編號(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è)列,以存儲各個(gè)實(shí)例的惟一標(biāo)識。簡而言之,第二范式就是非主屬性必須依賴于整個(gè)主關(guān)鍵字。

3
第三范式(3NF

滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門信息表,其中每個(gè)部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在圖3-2的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(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í),不會發(fā)生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給數(shù)據(jù)庫的編程人員制造麻煩,而且面目可憎,可能存儲了大量不需要的冗余信息。

設(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ù)、字符型、邏輯型、日期型等。

例如,如下的數(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)鍵字。

假定選課關(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)系表會存在如下問題:

(1)
數(shù)據(jù)冗余:

同一門課程由n個(gè)學(xué)生選修,"學(xué)分"就重復(fù)n-1次;同一個(gè)學(xué)生選修了m門課程,姓名和年齡就重復(fù)了m-1次。

(2)
更新異常:

若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的"學(xué)分"值都要更新,否則會出現(xiàn)同一門課程學(xué)分不同的情況。

(3)
插入異常:

假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒有人選修。這樣,由于還沒有"學(xué)號"關(guān)鍵字,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。

(4)
刪除異常:

假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是,與此同時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會導(dǎo)致插入異常。

把選課關(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ù)依賴,指的是如果存在"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é)號) → (所在學(xué)院) → (學(xué)院地點(diǎn), 學(xué)院電話)

即存在非關(guān)鍵字段"學(xué)院地點(diǎn)""學(xué)院電話"對關(guān)鍵字段"學(xué)號"的傳遞函數(shù)依賴。

它也會存在數(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, 存儲物品ID, 管理員ID, 數(shù)量),且有一個(gè)管理員只在一個(gè)倉庫工作;一個(gè)倉庫可以存儲多種物品。這個(gè)數(shù)據(jù)庫表中存在如下決定關(guān)系:

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

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

所以,(倉庫ID, 存儲物品ID)(管理員ID, 存儲物品ID)都是StorehouseManage的候選關(guān)鍵字,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系:

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

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

即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以其不符合BCNF范式。它會出現(xiàn)如下異常情況:

(1)
刪除異常:

當(dāng)倉庫被清空后,所有"存儲物品ID""數(shù)量"信息被刪除的同時(shí),"倉庫ID""管理員ID"信息也被刪除了。

(2)
插入異常:

當(dāng)倉庫沒有存儲任何物品時(shí),無法給倉庫分配管理員。

(3)
更新異常:

如果倉庫換了管理員,則表中所有行的管理員ID都要修改。

把倉庫管理關(guān)系表分解為二個(gè)關(guān)系表:

倉庫管理:StorehouseManage(倉庫ID, 管理員ID);

倉庫:Storehouse(倉庫ID, 存儲物品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 主頁 電話 聯(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) → (發(fā)帖標(biāo)題,發(fā)帖內(nèi)容)

(
回復(fù)ID) → (回復(fù)標(biāo)題,回復(fù)內(nèi)容)

即非關(guān)鍵字段部分函數(shù)依賴于候選關(guān)鍵字段,很明顯,這個(gè)設(shè)計(jì)會導(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"之間是1N的關(guān)系,因此我們可以把"發(fā)帖"合并到第2項(xiàng)的"帖子信息"中;第5項(xiàng)"回復(fù)"中的"發(fā)帖ID""回復(fù)ID"之間也是1N的關(guān)系,因此我們可以把"回復(fù)"合并到第3項(xiàng)的"回復(fù)信息"中。這樣可以一定量地減少數(shù)據(jù)冗余,新的設(shè)計(jì)為:

1 用戶信息:用戶名,email,主頁,電話,聯(lián)系地址

2 帖子信息:用戶名,發(fā)帖ID,標(biāo)題,內(nèi)容

3 回復(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ì)并不會導(dǎo)致數(shù)據(jù)冗余和操作異常;

數(shù)據(jù)庫表3中也存在非關(guān)鍵字段"標(biāo)題"、"內(nèi)容"對關(guān)鍵字段"回復(fù)ID"的部分函數(shù)依賴,也不滿足第二范式的要求,但是與數(shù)據(jù)庫表2相似,這一設(shè)計(jì)也不會導(dǎo)致數(shù)據(jù)冗余和操作異常。

由此可以看出,并不一定要強(qiáng)行滿足范式的要求,對于1N關(guān)系,當(dāng)1的一邊合并到N的那邊后,N的那邊就不再滿足第二范式了,但是這種設(shè)計(jì)反而比較好!

對于MN的關(guān)系,不能將M一邊或N一邊合并到另一邊去,這樣會導(dǎo)致不符合范式要求,同時(shí)導(dǎo)致操作異常和數(shù)據(jù)冗余。
對于11的關(guān)系,我們可以將左邊的1或者右邊的1合并到另一邊去,設(shè)計(jì)導(dǎo)致不符合范式要求,但是并不會導(dǎo)致操作異常和數(shù)據(jù)冗余。

結(jié)論

滿足范式要求的數(shù)據(jù)庫設(shè)計(jì)是結(jié)構(gòu)清晰的,同時(shí)可避免數(shù)據(jù)冗余和操作異常。這并意味著不符合范式要求的設(shè)計(jì)一定是錯(cuò)誤的,在數(shù)據(jù)庫表中存在111N關(guān)系這種較特殊的情況下,合并導(dǎo)致的不符合范式要求反而是合理的。
 

理解數(shù)據(jù)庫范式

系統(tǒng)是短暫的

數(shù)據(jù)是永恒的

數(shù) 據(jù)庫范式是數(shù)據(jù)庫設(shè)計(jì)中必不可少的知識,沒有對范式的理解,就無法設(shè)計(jì)出高效率、優(yōu)雅的數(shù)據(jù)庫。甚至設(shè)計(jì)出錯(cuò)誤的數(shù)據(jù)庫。而想要理解并掌握范式卻并不是那 么容易。教科書中一般以關(guān)系代數(shù)的方法來解釋數(shù)據(jù)庫范式。這樣做雖然能夠十分準(zhǔn)確的表達(dá)數(shù)據(jù)庫范式,但比較抽象,不太直觀,不便于理解,更難以記憶。

本 文用較為直白的語言介紹范式,旨在便于理解和記憶,這樣做可能會出現(xiàn)一些不精確的表述。但對于初學(xué)者應(yīng)該是個(gè)不錯(cuò)的入門。我寫下這些的目的主要是為了加強(qiáng) 記憶,其實(shí)我也比較菜,我希望當(dāng)我對一些概念生疏的時(shí)候,回過頭來看看自己寫的筆記,可以快速地進(jìn)入狀態(tài)。如果你發(fā)現(xiàn)其中用錯(cuò)誤,請指正。

       下面開始進(jìn)入正題:

一、基礎(chǔ)概念

要理解范式,首先必須對知道什么是關(guān)系數(shù)據(jù)庫,如果你不知道,我可以簡單的不能再簡單的說一下:關(guān)系數(shù)據(jù)庫就是用二維表來保存數(shù)據(jù)。表和表之間可以……(省略10W字)。

然后你應(yīng)該理解以下概念:

實(shí)體:現(xiàn)實(shí)世界中客觀存在并可以被區(qū)別的事物。比如“一個(gè)學(xué)生”、“一本書”、“一門課”等等。值得強(qiáng)調(diào)的是這里所說的“事物”不僅僅是看得見摸得著的“東西”,它也可以是虛擬的,不如說“老師與學(xué)校的關(guān)系”。

 

屬性:教科書上解釋為:“實(shí)體所具有的某一特性”,由此可見,屬性一開始是個(gè)邏輯概念,比如說,“性別”是“人”的一個(gè)屬性。在關(guān)系數(shù)據(jù)庫中,屬性又是個(gè)物理概念,屬性可以看作是“表的一列”。

 

元組:表中的一行就是一個(gè)元組。

 

分量:元組的某個(gè)屬性值。在一個(gè)關(guān)系數(shù)據(jù)庫中,它是一個(gè)操作原子,即關(guān)系數(shù)據(jù)庫在做任何操作的時(shí)候,屬性是“不可分的”。否則就不是關(guān)系數(shù)據(jù)庫了。

 

碼:表中可以唯一確定一個(gè)元組的某個(gè)屬性(或者屬性組),如果這樣的碼有不止一個(gè),那么大家都叫候選碼,我們從候選碼中挑一個(gè)出來做老大,它就叫主碼。

 

全碼:如果一個(gè)碼包含了所有的屬性,這個(gè)碼就是全碼。

 

主屬性:一個(gè)屬性只要在任何一個(gè)候選碼中出現(xiàn)過,這個(gè)屬性就是主屬性。

 

非主屬性:與上面相反,沒有在任何候選碼中出現(xiàn)過,這個(gè)屬性就是非主屬性。

 

外碼:一個(gè)屬性(或?qū)傩越M),它不是碼,但是它別的表的碼,它就是外碼。

 

二、6個(gè)范式

好了,上面已經(jīng)介紹了我們掌握范式所需要的全部基礎(chǔ)概念,下面我們就來講范式。首先要明白,范式的包含關(guān)系。一個(gè)數(shù)據(jù)庫設(shè)計(jì)如果符合第二范式,一定也符合第一范式。如果符合第三范式,一定也符合第二范式…

 

 

 

第一范式(1NF):屬性不可分。

在前面我們已經(jīng)介紹了屬性值的概念,我們說,它是“不可分的”。而第一范式要求屬性也不可分。那么它和屬性值不可分有什么區(qū)別呢?給一個(gè)例子:

name

tel

age

大寶

13612345678

22

小明

13988776655

0101234567

21

       

Ps:這個(gè)表中,屬性值“分”了。

name

tel

age

手機(jī)

座機(jī)

大寶

13612345678

0219876543

22

小明

13988776655

0101234567

21

Ps:這個(gè)表中,屬性 “分”了。

這兩種情況都不滿足第一范式。不滿足第一范式的數(shù)據(jù)庫,不是關(guān)系數(shù)據(jù)庫!所以,我們在任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,做不出這樣的“表”來。

 

 

 

第二范式(2NF:符合1NF,并且,非主屬性完全依賴于碼。

聽起來好像很神秘,其實(shí)真的沒什么。

一 個(gè)候選碼中的主屬性也可能是好幾個(gè)。如果一個(gè)主屬性,它不能單獨(dú)做為一個(gè)候選碼,那么它也不能確定任何一個(gè)非主屬性。給一個(gè)反例:我們考慮一個(gè)小學(xué)的教務(wù) 管理系統(tǒng),學(xué)生上課指定一個(gè)老師,一本教材,一個(gè)教室,一個(gè)時(shí)間,大家都上課去吧,沒有問題。那么數(shù)據(jù)庫怎么設(shè)計(jì)?(學(xué)生上課表)

學(xué)生

課程

老師

老師職稱

教材

教室

上課時(shí)間

小明

一年級語文(上)

大寶

副教授

《小學(xué)語文1

101

1430

一個(gè)學(xué)生上一門課,一定在特定某個(gè)教室。所以有(學(xué)生,課程)->教室

一個(gè)學(xué)生上一門課,一定是特定某個(gè)老師教。所以有(學(xué)生,課程)->老師

一個(gè)學(xué)生上一門課,他老師的職稱可以確定。所以有(學(xué)生,課程)->老師職稱

一個(gè)學(xué)生上一門課,一定是特定某個(gè)教材。所以有(學(xué)生,課程)->教材

一個(gè)學(xué)生上一門課,一定在特定時(shí)間。所以有(學(xué)生,課程)->上課時(shí)間

因此(學(xué)生,課程)是一個(gè)碼。

然而,一個(gè)課程,一定指定了某個(gè)教材,一年級語文肯定用的是《小學(xué)語文1》,那么就有課程->教材。(學(xué)生,課程)是個(gè)碼,課程卻決定了教材,這就叫做不完全依賴,或者說部分依賴。出現(xiàn)這樣的情況,就不滿足第二范式!

有什么不好嗎?你可以想想:

1、             校長要新增加一門課程叫“微積分”,教材是《大學(xué)數(shù)學(xué)》,怎么辦?學(xué)生還沒選課,而學(xué)生又是主屬性,主屬性不能空,課程怎么記錄呢,教材記到哪呢? ……郁悶了吧?(插入異常)

2、             下學(xué)期沒學(xué)生學(xué)一年級語文(上)了,學(xué)一年級語文(下)去了,那么表中將不存在一年級語文(上),也就沒了《小學(xué)語文1》。這時(shí)候,校長問:一年級語文(上)用的什么教材?。?#8230;…郁悶了吧?(刪除異常)

3、             校長說:一年級語文(上)換教材,換成《大學(xué)語文》。有10000個(gè)學(xué)生選了這么課,改動好大啊!改累死了……郁悶了吧?(修改異常)

那應(yīng)該怎么解決呢?投影分解,將一個(gè)表分解成兩個(gè)或若干個(gè)表

學(xué)生

課程

老師

老師職稱

教室

上課時(shí)間

小明

一年級語文(上)

大寶

副教授

101

1430

學(xué)生上課表新

課程

教材

一年級語文(上)

《小學(xué)語文1

課程的表

 

 

第三范式(3NF):符合2NF,并且,消除傳遞依賴

上面的“學(xué)生上課表新”符合2NF,可以這樣驗(yàn)證:兩個(gè)主屬性單獨(dú)使用,不用確定其它四個(gè)非主屬性的任何一個(gè)。但是它有傳遞依賴!

在哪呢?問題就出在“老師”和“老師職稱”這里。一個(gè)老師一定能確定一個(gè)老師職稱。

有什么問題嗎?想想:

1、  老師升級了,變教授了,要改數(shù)據(jù)庫,表中有N條,改了N次……(修改異常)

2、  沒人選這個(gè)老師的課了,老師的職稱也沒了記錄……(刪除異常)

3、  新來一個(gè)老師,還沒分配教什么課,他的職稱記到哪?……(插入異常)

那應(yīng)該怎么解決呢?和上面一樣,投影分解:

學(xué)生

課程

老師

教室

上課時(shí)間

小明

一年級語文(上)

大寶

101

1430

 

老師

老師職稱

大寶

副教授

 

BC范式(BCNF):符合3NF,并且,主屬性不依賴于主屬性

若關(guān)系模式屬于第一范式,且每個(gè)屬性都不傳遞依賴于鍵碼,則R屬于BC范式。

通常BC范式的條件有多種等價(jià)的表述:每個(gè)非平凡依賴的左邊必須包含鍵碼;每個(gè)決定因素必須包含鍵碼。

BC范式既檢查非主屬性,又檢查主屬性。當(dāng)只檢查非主屬性時(shí),就成了第三范式。滿足BC范式的關(guān)系都必然滿足第三范式。

還可以這么說:若一個(gè)關(guān)系達(dá)到了第三范式,并且它只有一個(gè)候選碼,或者它的每個(gè)候選碼都是單屬性,則該關(guān)系自然達(dá)到BC范式。

 

一般,一個(gè)數(shù)據(jù)庫設(shè)計(jì)符合3NFBCNF就可以了。在BC范式以上還有第四范式、第五范式。

第四范式:要求把同一表內(nèi)的多對多關(guān)系刪除。

第五范式:從最終結(jié)構(gòu)重新建立原始結(jié)構(gòu)。

但在絕大多數(shù)應(yīng)用中不需要設(shè)計(jì)到這種程度。并且,某些情況下,過于范式化甚至?xí)?shù)據(jù)庫的邏輯可讀性和使用效率起到阻礙。數(shù)據(jù)庫中一定程度的冗余并不一定是壞事情。如果你對第四范式、第五范式感興趣可以看一看專業(yè)教材,從頭學(xué)起,并且忘記我說的一切,以免對你產(chǎn)生誤導(dǎo)。
 

關(guān)系模式的范式

    主要有4種范式,1NF2NF,3NF,BCNF,按從左至右的順序一種比一種要求更嚴(yán)格。要符合某一種范式必須也滿足它前邊的所有范式。一般項(xiàng)目的數(shù)據(jù)庫設(shè)計(jì)達(dá)到3NF就可以了,而且可根據(jù)具體情況適當(dāng)增加冗余,不必教條地遵守所謂規(guī)范。

簡單而言,1NF就是要求一張表里只放相互關(guān)聯(lián)的字段,一個(gè)字段里只放一條信息,這只是最基本的要求。至于2NF,3NFBCNF雖然描述的內(nèi)容不同,但表現(xiàn)在數(shù)據(jù)特點(diǎn)上很相似,就好比在說不要為了向某廠訂購一批貨記下來,就把的廠的面積、電話等都放在同一張表里,而應(yīng)該用兩張表,以盡量避免浪費(fèi)數(shù)據(jù)存儲空間。因?yàn)楹屯粋€(gè)廠可能會交易好幾次,但沒必要每次交易都記錄全部的信息。

從范式所允許的函數(shù)依賴方面進(jìn)行比較,四種范式之間的關(guān)聯(lián)如下圖所示。

以下對每種范式作一一說明。

2.3.4.2  第一范式

在關(guān)系模式R中的每一個(gè)具體關(guān)系r中,如果每個(gè)屬性值 都是不可再分的最小數(shù)據(jù)單位,則稱R是第一范式的關(guān)系。

例:如職工號,姓名,電話號碼組成一個(gè)表(一個(gè)人可能有一個(gè)辦公室電話 和一個(gè)家里電話號碼) 規(guī)范成為1NF有三種方法:
一是重復(fù)存儲職工號和姓名。這樣,關(guān)鍵字只能是電話號碼。
二是職工號為關(guān)鍵字,電話號碼分為單位電話和住宅電話兩個(gè)屬性
三是職工號為關(guān)鍵字,但強(qiáng)制每條記錄只能有一個(gè)電話號碼。
以上三個(gè)方法,第一種方法最不可取,按實(shí)際情況選取后兩種情況。

2.3.4.3  第二范式

關(guān)系的第二范式(2NF)定義: 如果關(guān)系模式R1NF,并且R中的每一個(gè)非主屬性都完全依賴于R的某個(gè)候選關(guān)鍵字,則稱R是第二范式的,簡記為2NF。

【例2.40 設(shè)有關(guān)系模式R(學(xué)號S#,課程號C#,成績G,任課教師TN,教師專長TS),基于R的函數(shù)依賴集F={(S#,C#)→G,C#→TN,TN→TS},判斷R是否為2NF。

解:

(1) 容易看出,關(guān)系模式R1NF。因?yàn)?span>R符合關(guān)系的定義,R的所有屬性值都是不可再分的原子值。

R是否為2NF,應(yīng)根據(jù)2NF的定義來判斷。                                          

首先要確定關(guān)系模式R中各屬性間的函數(shù)依賴情況。如果沒有直接給出R的函數(shù)依賴集,就要按照語義把它確定下來。在本例中,已直接給出基于R的函數(shù)依賴集F,我們可使用阿氏推理規(guī)則并結(jié)合下面介紹的方法,進(jìn)一步確定R中哪些是主屬性、哪些是非主屬性、侯選關(guān)鍵字由哪些屬性構(gòu)成。

方法①  寫出函數(shù)依賴集F中的各個(gè)函數(shù)依賴以幫助分析。方法的特點(diǎn)是直接。

F={(S#,C#)→G,

C#→TN,

TN→TS

}

    方法②  用有向圖表示屬性間函數(shù)依賴,結(jié)點(diǎn)表示屬性,方框包含若干個(gè)結(jié)點(diǎn)表示屬性組合,有向箭頭表示函數(shù)依賴。本例的函數(shù)依賴圖如圖2.9所示。方法的特點(diǎn)是直觀

2.9 函數(shù)依賴圖例子

    方法③  把關(guān)系模式R與函數(shù)依賴集F結(jié)合起來,屬性組合用下劃線(或上劃線)表示,函數(shù)依賴用有向箭頭表示。本例的函數(shù)依賴簡圖如圖2.10所示。方法的特點(diǎn)是簡單

2.10函數(shù)依賴簡圖例子

    用阿氏推理規(guī)則由F可推出:(S#,C#)→{S#,C#,G,TN,TS},即屬性組合(S#,C#)R的候選關(guān)鍵字(R只有這一個(gè)候選鍵)。(S#,C#)的一個(gè)值可惟一標(biāo)識R中的一個(gè)元組(并且沒有多余的屬性)。

R中,S#,C#是主屬性;其余的屬性G,TN,TS為非主屬性。

借助上面的圖,我們可以看到,非主屬性G對鍵是完全依賴:(S#,C#)→G。但非主屬性TN,TS對鍵是部分依賴(他們僅依賴于鍵的真子集C#)。由于R中存在非主屬性對候選鍵的部分依賴,所以關(guān)系模式R不是2NF

R中存在非主屬性對候選鍵的部分依賴,將會引起數(shù)據(jù)冗余、數(shù)據(jù)操作異常等問題。可以把關(guān)系R無損聯(lián)接地分解成兩個(gè)2NF的關(guān)系模式:

ρ={R1,R2},R1={S#.C#,G},R2={C#,TN,TS}。

【例2.41】選課關(guān)系 SCISNO,CNOGRADE,CREDIT)其中SNO為學(xué)號, CNO為課程號,GRADEGE 為成績,CREDIT 為學(xué)分。

由以上條件,關(guān)鍵字為組合關(guān)鍵字(SNO,CNO
在應(yīng)用中使用以上關(guān)系模式有以下問題:
a.
數(shù)據(jù)冗余,假設(shè)同一門課由40個(gè)學(xué)生選修,學(xué)分就 重復(fù)40次。
b.
更新異常,若調(diào)整了某課程的學(xué)分,相應(yīng)的元組CREDIT值都要更新,有可能會出現(xiàn)同一門課學(xué)分不同。
c.
插入異常,如計(jì)劃開新課,由于沒人選修,沒有學(xué)號關(guān)鍵字,只能等有人選修才能把課程和學(xué)分存入。
d.
刪除異常,若學(xué)生已經(jīng)結(jié)業(yè),從當(dāng)前數(shù)據(jù)庫刪除選修記錄,就會可能連課程號及學(xué)分完全從數(shù)據(jù)庫中刪除,則此門課程及學(xué)分記錄無法保存。
原因:非關(guān)鍵字屬性CREDIT僅函數(shù)依賴于CNO,也就是CREDIT部分依賴組合關(guān)鍵字(SNO,CNO)而不是完全依賴。
解決方法:分成兩個(gè)關(guān)系模式 SC1SNO,CNOGRADE),C2CNO,CREDIT)。新關(guān)系包括兩個(gè)關(guān)系模式,它們之間通過SC1中的外關(guān)鍵字CNO相聯(lián)系,需要時(shí)再進(jìn)行自然聯(lián)接,恢復(fù)了原來的關(guān)系
 

2.3.4.4  第三范式

關(guān)系的第三范式(3NF)定義: 如果關(guān)系模式R2NF,并且R中的每一個(gè)非主屬性都不傳遞依賴于R的某個(gè)候選關(guān)鍵字,則稱R是第三范式的,簡記為3NF

【例2.42】續(xù)上例2.40R(學(xué)號S#,課程號C#,成績G,任課教師TN,教師專長TS)),判斷關(guān)系模式R1={S#.C#,G},R2={C#,TN,TS} 是否為3NF。

解:

(1) 在關(guān)系模式R1={S#,C#,G},候選關(guān)鍵字是(S#,C#),主屬性是S#,C#,非主屬性是G,函數(shù)依賴為(S#,C#)→G。  由于R1中不存在非主屬性對候選關(guān)鍵字的傳遞依賴,所以關(guān)系模式R13NF。

(2) 在關(guān)系模式R2={C#,TN,TS},候選關(guān)鍵字是C#,主屬性是C#,非主屬性是TN,TS,函數(shù)依賴為C#→TN,TN→TS。由于R2中存在非主屬性對候選關(guān)鍵字的傳遞依賴C# TS,所以關(guān)系模式R2不是3NF。

可以把關(guān)系R2無損聯(lián)接地分解成兩個(gè)3NF的關(guān)系模式:

ρ={R3,R4},R3={C#,TN},R4={TN,TS}。

【例2.43】如(SNO,SNAME,DNO,DNAME,LOCATION 各屬性分別代表學(xué)號,
姓名,所在系,系名稱,系地址。
判斷關(guān)系模式S1是否為3NF。


關(guān)鍵字SNO決定各個(gè)屬性。由于是單個(gè)關(guān)鍵字,沒有部分依賴的問題,是2NF

但這關(guān)系有大量的冗余,有關(guān)學(xué)生所在的幾個(gè)屬性DNODNAME,LOCATION將重復(fù)存儲,插入,刪除和修改時(shí)也將產(chǎn)生類似以上例的情況。
原因:關(guān)系中存在傳遞依賴造成的。關(guān)鍵字 SNO LOCATION 函數(shù)決定是通過傳遞依賴:SNO -> DNO,及DNO -> LOCATION實(shí)現(xiàn)的。也就是說,SNO不直接決定非主屬性LOCATION,不是3NF。
解決目地:每個(gè)關(guān)系模式中不能留有傳遞依賴。
解決方法:分為兩個(gè)關(guān)系 SSNO,SNAMEDNO),DDNO,DNAME,LOCATION
注意:關(guān)系S中不能沒有外關(guān)鍵字DNO。否則兩個(gè)關(guān)系之間失去聯(lián)系。

2.3.4.5   Boyce-Codd范式

關(guān)系的Boyce-Codd范式(BCNF)定義: 如果關(guān)系模式R1NF,并且R中的每一個(gè)函數(shù)依賴X→Y(YÏX),必有XR的超關(guān)鍵字,則稱RBoyce-Codd范式的,簡記為BCNF

BCNF的定義中,可以明顯地得出如下結(jié)論:

(1) 所有非主屬性對鍵是完全函數(shù)依賴;

(2) 所有主屬性對不包含它的鍵是完全函數(shù)依賴;

(3)沒有屬性完全函數(shù)依賴于非鍵的任何屬性組合。

2NF,3NF的定義不同,BCNF的定義直接建立在1NF的基礎(chǔ)上。但實(shí)質(zhì)上BCNF3NF的改進(jìn)形式。3NF僅考慮了非主屬性對鍵的依賴情況,BCNF把主屬性對鍵的依賴情況也包括進(jìn)去BCNF要求滿足的條件比3NF所要求的更高。如果關(guān)系模式RBCNF的,那么R必定是3NF,反之,則不一定成立。

【例2.43 續(xù)前例2.42學(xué)號S#,課程號C#,成績G,任課教師TN,教師專長TS,判斷兩個(gè)3NF關(guān)系模式R3={C#,TN},R4={TN,TS}是否為BCNF。

解:在關(guān)系模式R3中有函數(shù)依賴C#→TN,決定因素C#R3的鍵;

在關(guān)系模式R4中有函數(shù)依賴TN→TS,決定因素TNR4的鍵;

     R3,R4都滿足BCNF的定義,所以,這兩個(gè)關(guān)系模式都是BCNF

【例2.44配件管理關(guān)系模式 WPEWNO,PNOENO,QNT)分別表倉庫號,配件號,職工號,數(shù)量。有以下條件
a.
一個(gè)倉庫有多個(gè)職工。
b.
一個(gè)職工僅在一個(gè)倉庫工作。
c.
每個(gè)倉庫里一種型號的配件由專人負(fù)責(zé),但一個(gè)人可以管理幾種配件。
d.
同一種型號的配件可以分放在幾個(gè)倉庫中

分析:由以上得 PNO 不能確定QNT,由組合屬性(WNO,PNO)來決定,存在函數(shù)依賴(WNOPNO -> ENO。由于每個(gè)倉庫里的一種配件由專人負(fù)責(zé),而一個(gè)人可以管理幾種配件,所以有組合屬性(WNO,PNO)才能確定負(fù)責(zé)人,有(WNOPNO-> ENO。因?yàn)?span>
一個(gè)職工僅在一個(gè)倉庫工作,有ENO -> WNO。由于每個(gè)倉庫里的一種配件由專人負(fù)責(zé),而一個(gè)職工僅在一個(gè)倉庫工作,有 ENO,PNO-> QNT。
找一下候選關(guān)鍵字,因?yàn)椋?span>WNO,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)?span>ENO->WNO,主屬性ENOWNO的決定因素,但是它本身不是關(guān)鍵字,只是組合關(guān)鍵字的一部分。這就造成主屬性WNO對另外一個(gè)候選關(guān)鍵字(ENO,PNO)的部 分依賴,因?yàn)椋?span>ENO,PNO-> ENO但反過來不成立,而P->WNO,故(ENOPNO-> WNO 也是傳遞依賴。
雖然沒有非主屬性對候選關(guān)鍵遼的傳遞依賴,但存在主屬性對候選關(guān)鍵字的傳遞依賴,同樣也會帶來麻煩。如一個(gè)新職工分配到倉庫工作,但暫時(shí)處于實(shí)習(xí)階段,沒有獨(dú)立負(fù)責(zé)對某些配件的管理任務(wù)。由于缺少關(guān)鍵字的一部分PNO而無法插入到該關(guān)系中去。又如某個(gè)人改成不管配件了去負(fù)責(zé)安全,則在刪除配件的同時(shí)該職工也會被刪除。
解決辦法:分成管理EPENO,PNO,QNT),關(guān)鍵字是(ENO,PNO)工作EWENO,WNO)其關(guān)鍵字是ENO
缺點(diǎn):分解后函數(shù)依賴的保持性較差。如此例中,由于分解,函數(shù)依賴(WNO,PNO-> ENO 丟失了, 因而對原來的語義有所破壞。沒有體現(xiàn)出每個(gè)倉庫里一種部件由專人負(fù)責(zé)。有可能出現(xiàn) 一部件由兩個(gè)人或兩個(gè)以上的人來同時(shí)管理。因此,分解之后的關(guān)系模式降低了部分完整性約束。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多