中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
數(shù)據(jù)庫范式 相關(guān)復(fù)習(xí)
東西很多 要慢慢看。。大概整合了三篇文章
設(shè)計(jì)范式(范式,數(shù)據(jù)庫設(shè)計(jì)范式,數(shù)據(jù)庫的設(shè)計(jì)范式)是符合某一種級(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í)別數(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à)格,而你想要?jiǎng)h除其中的一個(gè)顧客,這時(shí)你就必須同時(shí)刪除一個(gè)價(jià)格。范化就是要解決這個(gè)問題,你可以將這個(gè)表化為兩個(gè)表,一個(gè)用于存儲(chǔ)每個(gè)顧客和他所買物品的信息,另一個(gè)用于存儲(chǔ)每件產(chǎn)品和其價(jià)格的信息,這樣對(duì)其中一個(gè)表做添加或刪除操作就不會(huì)影響另一個(gè)表。
關(guān)系數(shù)據(jù)庫的幾種設(shè)計(jì)范式介紹
1 第一范式(1NF)
在任何一個(gè)關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對(duì)關(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í)體之間為一對(duì)多關(guān)系。在第一范式(1NF)中表的每一行只包含一個(gè)實(shí)例的信息。例如,對(duì)于圖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è)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。如圖3-2 員工信息表中加上了員工編號(hào)(emp_id)列,因?yàn)槊總€(gè)員工的員工編號(hào)是惟一的,因此每個(gè)員工可以被惟一區(qū)分。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。
第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。簡而言之,第二范式就是非主屬性必須依賴于整個(gè)主關(guān)鍵字。
3 第三范式(3NF)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門信息表,其中每個(gè)部門有部門編號(hào)(dept_id)、部門名稱、部門簡介等信息。那么在圖3-2的員工信息表中列出部門編號(hào)后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(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í),不會(huì)發(fā)生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給數(shù)據(jù)庫的編程人員制造麻煩,而且面目可憎,可能存儲(chǔ)了大量不需要的冗余信息。
設(shè)計(jì)范式是不是很難懂呢?非也,大學(xué)教材上給我們一堆數(shù)學(xué)公式我們當(dāng)然看不懂,也記不住。所以我們很多人就根本不按照范式來設(shè)計(jì)數(shù)據(jù)庫。
實(shí)質(zhì)上,設(shè)計(jì)范式用很形象、很簡潔的話語就能說清楚,道明白。本文將對(duì)范式進(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)鍵字段對(duì)任一候選關(guān)鍵字段的部分函數(shù)依賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。
假定選課關(guān)系表為SelectCourse(學(xué)號(hào), 姓名, 年齡, 課程名稱, 成績, 學(xué)分),關(guān)鍵字為組合關(guān)鍵字(學(xué)號(hào), 課程名稱),因?yàn)榇嬖谌缦聸Q定關(guān)系:
(學(xué)號(hào), 課程名稱) → (姓名, 年齡, 成績, 學(xué)分)
這個(gè)數(shù)據(jù)庫表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:
(課程名稱) → (學(xué)分)
(學(xué)號(hào)) → (姓名, 年齡)
即存在組合關(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é)分不同的情況。
(3) 插入異常:
假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒有人選修。這樣,由于還沒有"學(xué)號(hào)"關(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é)號(hào), 姓名, 年齡);
課程:Course(課程名稱, 學(xué)分);
選課關(guān)系:SelectCourse(學(xué)號(hào), 課程名稱, 成績)。
這樣的數(shù)據(jù)庫表是符合第二范式的, 消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。
另外,所有單關(guān)鍵字的數(shù)據(jù)庫表都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。
第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對(duì)任一候選關(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é)號(hào), 姓名, 年齡, 所在學(xué)院, 學(xué)院地點(diǎn), 學(xué)院電話),關(guān)鍵字為單一關(guān)鍵字"學(xué)號(hào)",因?yàn)榇嬖谌缦聸Q定關(guān)系:
(學(xué)號(hào)) → (姓名, 年齡, 所在學(xué)院, 學(xué)院地點(diǎn), 學(xué)院電話)
這個(gè)數(shù)據(jù)庫是符合2NF的,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:
(學(xué)號(hào)) → (所在學(xué)院) → (學(xué)院地點(diǎn), 學(xué)院電話)
即存在非關(guān)鍵字段"學(xué)院地點(diǎn)"、"學(xué)院電話"對(duì)關(guān)鍵字段"學(xué)號(hào)"的傳遞函數(shù)依賴。
它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。
把學(xué)生關(guān)系表分為如下兩個(gè)表:
學(xué)生:(學(xué)號(hào), 姓名, 年齡, 所在學(xué)院);
學(xué)院:(學(xué)院, 地點(diǎn), 電話)。
這樣的數(shù)據(jù)庫表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。
鮑依斯-科得范式(BCNF):在第三范式的基礎(chǔ)上,數(shù)據(jù)庫表中如果不存在任何字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。
假設(shè)倉庫管理關(guān)系表為StorehouseManage(倉庫ID, 存儲(chǔ)物品ID, 管理員ID, 數(shù)量),且有一個(gè)管理員只在一個(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"信息也被刪除了。
(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 主頁 電話 聯(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ì)會(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)的"帖子信息"中;第5項(xiàng)"回復(fù)"中的"發(fā)帖ID"和"回復(fù)ID"之間也是1:N的關(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)容"對(duì)關(guān)鍵字段"發(fā)帖ID"的部分函數(shù)依賴,即不滿足第二范式的要求,但是這一設(shè)計(jì)并不會(huì)導(dǎo)致數(shù)據(jù)冗余和操作異常;
數(shù)據(jù)庫表3中也存在非關(guān)鍵字段"標(biāo)題"、"內(nèi)容"對(duì)關(guān)鍵字段"回復(fù)ID"的部分函數(shù)依賴,也不滿足第二范式的要求,但是與數(shù)據(jù)庫表2相似,這一設(shè)計(jì)也不會(huì)導(dǎo)致數(shù)據(jù)冗余和操作異常。
由此可以看出,并不一定要強(qiáng)行滿足范式的要求,對(duì)于1:N關(guān)系,當(dāng)1的一邊合并到N的那邊后,N的那邊就不再滿足第二范式了,但是這種設(shè)計(jì)反而比較好!
對(duì)于M:N的關(guān)系,不能將M一邊或N一邊合并到另一邊去,這樣會(huì)導(dǎo)致不符合范式要求,同時(shí)導(dǎo)致操作異常和數(shù)據(jù)冗余。
對(duì)于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)系這種較特殊的情況下,合并導(dǎo)致的不符合范式要求反而是合理的。
理解數(shù)據(jù)庫范式
系統(tǒng)是短暫的
數(shù)據(jù)是永恒的
數(shù) 據(jù)庫范式是數(shù)據(jù)庫設(shè)計(jì)中必不可少的知識(shí),沒有對(duì)范式的理解,就無法設(shè)計(jì)出高效率、優(yōu)雅的數(shù)據(jù)庫。甚至設(shè)計(jì)出錯(cuò)誤的數(shù)據(jù)庫。而想要理解并掌握范式卻并不是那 么容易。教科書中一般以關(guān)系代數(shù)的方法來解釋數(shù)據(jù)庫范式。這樣做雖然能夠十分準(zhǔn)確的表達(dá)數(shù)據(jù)庫范式,但比較抽象,不太直觀,不便于理解,更難以記憶。
本 文用較為直白的語言介紹范式,旨在便于理解和記憶,這樣做可能會(huì)出現(xiàn)一些不精確的表述。但對(duì)于初學(xué)者應(yīng)該是個(gè)不錯(cuò)的入門。我寫下這些的目的主要是為了加強(qiáng) 記憶,其實(shí)我也比較菜,我希望當(dāng)我對(duì)一些概念生疏的時(shí)候,回過頭來看看自己寫的筆記,可以快速地進(jìn)入狀態(tài)。如果你發(fā)現(xiàn)其中用錯(cuò)誤,請(qǐng)指正。
下面開始進(jìn)入正題:
一、基礎(chǔ)概念
要理解范式,首先必須對(duì)知道什么是關(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
010-1234567
21
Ps:這個(gè)表中,屬性值“分”了。
name
tel
age
手機(jī)
座機(jī)
大寶
13612345678
021-9876543
22
小明
13988776655
010-1234567
21
Ps:這個(gè)表中,屬性 “分”了。
這兩種情況都不滿足第一范式。不滿足第一范式的數(shù)據(jù)庫,不是關(guān)系數(shù)據(jù)庫!所以,我們?cè)谌魏侮P(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í)間
小明
一年級(jí)語文(上)
大寶
副教授
《小學(xué)語文1》
101
14:30
一個(gè)學(xué)生上一門課,一定在特定某個(gè)教室。所以有(學(xué)生,課程)->教室
一個(gè)學(xué)生上一門課,一定是特定某個(gè)老師教。所以有(學(xué)生,課程)->老師
一個(gè)學(xué)生上一門課,他老師的職稱可以確定。所以有(學(xué)生,課程)->老師職稱
一個(gè)學(xué)生上一門課,一定是特定某個(gè)教材。所以有(學(xué)生,課程)->教材
一個(gè)學(xué)生上一門課,一定在特定時(shí)間。所以有(學(xué)生,課程)->上課時(shí)間
因此(學(xué)生,課程)是一個(gè)碼。
然而,一個(gè)課程,一定指定了某個(gè)教材,一年級(jí)語文肯定用的是《小學(xué)語文1》,那么就有課程->教材。(學(xué)生,課程)是個(gè)碼,課程卻決定了教材,這就叫做不完全依賴,或者說部分依賴。出現(xiàn)這樣的情況,就不滿足第二范式!
有什么不好嗎?你可以想想:
1、             校長要新增加一門課程叫“微積分”,教材是《大學(xué)數(shù)學(xué)》,怎么辦?學(xué)生還沒選課,而學(xué)生又是主屬性,主屬性不能空,課程怎么記錄呢,教材記到哪呢? ……郁悶了吧?(插入異常)
2、             下學(xué)期沒學(xué)生學(xué)一年級(jí)語文(上)了,學(xué)一年級(jí)語文(下)去了,那么表中將不存在一年級(jí)語文(上),也就沒了《小學(xué)語文1》。這時(shí)候,校長問:一年級(jí)語文(上)用的什么教材?。?#8230;…郁悶了吧?(刪除異常)
3、             校長說:一年級(jí)語文(上)換教材,換成《大學(xué)語文》。有10000個(gè)學(xué)生選了這么課,改動(dòng)好大??!改累死了……郁悶了吧?(修改異常)
那應(yīng)該怎么解決呢?投影分解,將一個(gè)表分解成兩個(gè)或若干個(gè)表
學(xué)生
課程
老師
老師職稱
教室
上課時(shí)間
小明
一年級(jí)語文(上)
大寶
副教授
101
14:30
學(xué)生上課表新
課程
教材
一年級(jí)語文(上)
《小學(xué)語文1》
課程的表
第三范式(3NF):符合2NF,并且,消除傳遞依賴
上面的“學(xué)生上課表新”符合2NF,可以這樣驗(yàn)證:兩個(gè)主屬性單獨(dú)使用,不用確定其它四個(gè)非主屬性的任何一個(gè)。但是它有傳遞依賴!
在哪呢?問題就出在“老師”和“老師職稱”這里。一個(gè)老師一定能確定一個(gè)老師職稱。
有什么問題嗎?想想:
1、  老師升級(jí)了,變教授了,要改數(shù)據(jù)庫,表中有N條,改了N次……(修改異常)
2、  沒人選這個(gè)老師的課了,老師的職稱也沒了記錄……(刪除異常)
3、  新來一個(gè)老師,還沒分配教什么課,他的職稱記到哪?……(插入異常)
那應(yīng)該怎么解決呢?和上面一樣,投影分解:
學(xué)生
課程
老師
教室
上課時(shí)間
小明
一年級(jí)語文(上)
大寶
101
14:30
老師
老師職稱
大寶
副教授
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ì)符合3NF或BCNF就可以了。在BC范式以上還有第四范式、第五范式。
第四范式:要求把同一表內(nèi)的多對(duì)多關(guān)系刪除。
第五范式:從最終結(jié)構(gòu)重新建立原始結(jié)構(gòu)。
但在絕大多數(shù)應(yīng)用中不需要設(shè)計(jì)到這種程度。并且,某些情況下,過于范式化甚至?xí)?duì)數(shù)據(jù)庫的邏輯可讀性和使用效率起到阻礙。數(shù)據(jù)庫中一定程度的冗余并不一定是壞事情。如果你對(duì)第四范式、第五范式感興趣可以看一看專業(yè)教材,從頭學(xué)起,并且忘記我說的一切,以免對(duì)你產(chǎn)生誤導(dǎo)。
關(guān)系模式的范式
主要有4種范式,1NF,2NF,3NF,BCNF,按從左至右的順序一種比一種要求更嚴(yán)格。要符合某一種范式必須也滿足它前邊的所有范式。一般項(xiàng)目的數(shù)據(jù)庫設(shè)計(jì)達(dá)到3NF就可以了,而且可根據(jù)具體情況適當(dāng)增加冗余,不必教條地遵守所謂規(guī)范。
簡單而言,1NF就是要求一張表里只放相互關(guān)聯(lián)的字段,一個(gè)字段里只放一條信息,這只是最基本的要求。至于2NF,3NF,BCNF雖然描述的內(nèi)容不同,但表現(xiàn)在數(shù)據(jù)特點(diǎn)上很相似,就好比在說不要為了向某廠訂購一批貨記下來,就把的廠的面積、電話等都放在同一張表里,而應(yīng)該用兩張表,以盡量避免浪費(fèi)數(shù)據(jù)存儲(chǔ)空間。因?yàn)楹屯粋€(gè)廠可能會(huì)交易好幾次,但沒必要每次交易都記錄全部的信息。
從范式所允許的函數(shù)依賴方面進(jìn)行比較,四種范式之間的關(guān)聯(lián)如下圖所示。
以下對(duì)每種范式作一一說明。
2.3.4.2  第一范式
在關(guān)系模式R中的每一個(gè)具體關(guān)系r中,如果每個(gè)屬性值 都是不可再分的最小數(shù)據(jù)單位,則稱R是第一范式的關(guān)系。
例:如職工號(hào),姓名,電話號(hào)碼組成一個(gè)表(一個(gè)人可能有一個(gè)辦公室電話 和一個(gè)家里電話號(hào)碼) 規(guī)范成為1NF有三種方法:
一是重復(fù)存儲(chǔ)職工號(hào)和姓名。這樣,關(guān)鍵字只能是電話號(hào)碼。
二是職工號(hào)為關(guān)鍵字,電話號(hào)碼分為單位電話和住宅電話兩個(gè)屬性
三是職工號(hào)為關(guān)鍵字,但強(qiáng)制每條記錄只能有一個(gè)電話號(hào)碼。
以上三個(gè)方法,第一種方法最不可取,按實(shí)際情況選取后兩種情況。
2.3.4.3  第二范式
關(guān)系的第二范式(2NF)定義: 如果關(guān)系模式R為1NF,并且R中的每一個(gè)非主屬性都完全依賴于R的某個(gè)候選關(guān)鍵字,則稱R是第二范式的,簡記為2NF。
【例2.40】 設(shè)有關(guān)系模式R(學(xué)號(hào)S#,課程號(hào)C#,成績G,任課教師TN,教師專長TS),基于R的函數(shù)依賴集F={(S#,C#)→G,C#→TN,TN→TS},判斷R是否為2NF。
解:
(1) 容易看出,關(guān)系模式R是1NF。因?yàn)镽符合關(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)識(shí)R中的一個(gè)元組(并且沒有多余的屬性)。
在R中,S#,C#是主屬性;其余的屬性G,TN,TS為非主屬性。
借助上面的圖,我們可以看到,非主屬性G對(duì)鍵是完全依賴:(S#,C#)→G。但非主屬性TN,TS對(duì)鍵是部分依賴(他們僅依賴于鍵的真子集C#)。由于R中存在非主屬性對(duì)候選鍵的部分依賴,所以關(guān)系模式R不是2NF。
R中存在非主屬性對(duì)候選鍵的部分依賴,將會(huì)引起數(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)系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO為學(xué)號(hào), CNO為課程號(hào),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值都要更新,有可能會(huì)出現(xiàn)同一門課學(xué)分不同。
c.插入異常,如計(jì)劃開新課,由于沒人選修,沒有學(xué)號(hào)關(guān)鍵字,只能等有人選修才能把課程和學(xué)分存入。
d.刪除異常,若學(xué)生已經(jīng)結(jié)業(yè),從當(dāng)前數(shù)據(jù)庫刪除選修記錄,就會(huì)可能連課程號(hào)及學(xué)分完全從數(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)系
2.3.4.4  第三范式
關(guān)系的第三范式(3NF)定義: 如果關(guān)系模式R為2NF,并且R中的每一個(gè)非主屬性都不傳遞依賴于R的某個(gè)候選關(guān)鍵字,則稱R是第三范式的,簡記為3NF。
【例2.42】續(xù)上例2.40(R(學(xué)號(hào)S#,課程號(hào)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中不存在非主屬性對(duì)候選關(guān)鍵字的傳遞依賴,所以關(guān)系模式R1是3NF。
(2) 在關(guān)系模式R2={C#,TN,TS},候選關(guān)鍵字是C#,主屬性是C#,非主屬性是TN,TS,函數(shù)依賴為C#→TN,TN→TS。由于R2中存在非主屬性對(duì)候選關(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é)號(hào),
姓名,所在系,系名稱,系地址。 判斷關(guān)系模式S1是否為3NF。
關(guān)鍵字SNO決定各個(gè)屬性。由于是單個(gè)關(guān)鍵字,沒有部分依賴的問題,是2NF。
但這關(guān)系有大量的冗余,有關(guān)學(xué)生所在的幾個(gè)屬性DNO,DNAME,LOCATION將重復(fù)存儲(chǔ),插入,刪除和修改時(shí)也將產(chǎn)生類似以上例的情況。
原因:關(guān)系中存在傳遞依賴造成的。關(guān)鍵字 SNO 對(duì) LOCATION 函數(shù)決定是通過傳遞依賴:SNO -> DNO,及DNO -> LOCATION實(shí)現(xiàn)的。也就是說,SNO不直接決定非主屬性LOCATION,不是3NF。
解決目地:每個(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)系。
2.3.4.5   Boyce-Codd范式
關(guān)系的Boyce-Codd范式(BCNF)定義: 如果關(guān)系模式R為1NF,并且R中的每一個(gè)函數(shù)依賴X→Y(YÏX),必有X是R的超關(guān)鍵字,則稱R是Boyce-Codd范式的,簡記為BCNF。
從BCNF的定義中,可以明顯地得出如下結(jié)論:
(1) 所有非主屬性對(duì)鍵是完全函數(shù)依賴;
(2) 所有主屬性對(duì)不包含它的鍵是完全函數(shù)依賴;
(3)沒有屬性完全函數(shù)依賴于非鍵的任何屬性組合。
與2NF,3NF的定義不同,BCNF的定義直接建立在1NF的基礎(chǔ)上。但實(shí)質(zhì)上BCNF是3NF的改進(jìn)形式。3NF僅考慮了非主屬性對(duì)鍵的依賴情況,BCNF把主屬性對(duì)鍵的依賴情況也包括進(jìn)去。BCNF要求滿足的條件比3NF所要求的更高。如果關(guān)系模式R是BCNF的,那么R必定是3NF,反之,則不一定成立。
【例2.43】 續(xù)前例2.42(學(xué)號(hào)S#,課程號(hào)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,決定因素TN是R4的鍵;
R3,R4都滿足BCNF的定義,所以,這兩個(gè)關(guān)系模式都是BCNF。
【例2.44】配件管理關(guān)系模式 WPE(WNO,PNO,ENO,QNT)分別表倉庫號(hào),配件號(hào),職工號(hào),數(shù)量。有以下條件
a.一個(gè)倉庫有多個(gè)職工。
b.一個(gè)職工僅在一個(gè)倉庫工作。
c.每個(gè)倉庫里一種型號(hào)的配件由專人負(fù)責(zé),但一個(gè)人可以管理幾種配件。
d.同一種型號(hào)的配件可以分放在幾個(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,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。它對(duì)任何一個(gè)候選關(guān)鍵字都是完全函數(shù)依賴的,并且是直接依賴,所以該關(guān)系模式是3NF。
分析一下主屬性。因?yàn)镋NO->WNO,主屬性ENO是WNO的決定因素,但是它本身不是關(guān)鍵字,只是組合關(guān)鍵字的一部分。這就造成主屬性WNO對(duì)另外一個(gè)候選關(guān)鍵字(ENO,PNO)的部 分依賴,因?yàn)椋‥NO,PNO)-> ENO但反過來不成立,而P->WNO,故(ENO,PNO)-> WNO 也是傳遞依賴。
雖然沒有非主屬性對(duì)候選關(guān)鍵遼的傳遞依賴,但存在主屬性對(duì)候選關(guān)鍵字的傳遞依賴,同樣也會(huì)帶來麻煩。如一個(gè)新職工分配到倉庫工作,但暫時(shí)處于實(shí)習(xí)階段,沒有獨(dú)立負(fù)責(zé)對(duì)某些配件的管理任務(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ù)依賴的保持性較差。如此例中,由于分解,函數(shù)依賴(WNO,PNO)-> ENO 丟失了, 因而對(duì)原來的語義有所破壞。沒有體現(xiàn)出每個(gè)倉庫里一種部件由專人負(fù)責(zé)。有可能出現(xiàn) 一部件由兩個(gè)人或兩個(gè)以上的人來同時(shí)管理。因此,分解之后的關(guān)系模式降低了部分完整性約束。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)系型數(shù)據(jù)庫設(shè)計(jì)范式 - 舞步者 - 博客園
數(shù)據(jù)庫的四個(gè)范式之間的區(qū)別
數(shù)據(jù)庫關(guān)系范式
關(guān)系數(shù)據(jù)庫理論:數(shù)據(jù)庫的六大范式知識(shí)筆記
數(shù)據(jù)庫筆試題2
SQL三大范式三個(gè)例子搞定
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服