- 關(guān)系數(shù)據(jù)庫與SQL Server(2019版)
- 段利文 龔小勇主編
- 6334字
- 2021-12-17 17:41:02
項目1.5 規(guī)范化關(guān)系數(shù)據(jù)模型
在關(guān)系數(shù)據(jù)庫中,對于同一個問題,選用不同關(guān)系模式集合作為數(shù)據(jù)庫模式,其性能的優(yōu)劣是大不相同的,某些數(shù)據(jù)庫模式的設(shè)計常常會帶來存儲異常,這不利于實際應用。為區(qū)分數(shù)據(jù)庫模式的優(yōu)劣,常常把關(guān)系模式分為各種不同等級的范式(Normal Form)。
任務1.5.1 了解關(guān)系規(guī)范化
1.關(guān)系規(guī)范化的含義
通常將關(guān)系模式分為5個級別,即5種范式。滿足最低條件的稱為第一范式,簡稱1NF。在第一范式基礎(chǔ)上進一步滿足一些要求的可升級為第二范式(2NF),其余依次類推。通常,關(guān)系模式R是第X范式就寫成R∈XNF。
一個低一級范式的關(guān)系模式,通過分解可以轉(zhuǎn)換為若干個高一級范式的關(guān)系模式,這種過程稱為關(guān)系的規(guī)范化。
2.關(guān)系規(guī)范化的作用
關(guān)系規(guī)范化的主要目的是解決數(shù)據(jù)庫中數(shù)據(jù)冗余、插入異常、刪除異常和更新異常等數(shù)據(jù)存儲問題。例如,在關(guān)系模式SCD(學號,姓名,課程名,成績,教師名,職稱)中,如果有200名學生學習了數(shù)據(jù)庫基礎(chǔ)這門課程,那么在SCD表中,就必須重復輸入200次教師的名字和教師的職稱信息,因此這種關(guān)系模式存在數(shù)據(jù)冗余的問題;如果要在SCD表中插入劉強老師的姓名和職稱信息,但劉強老師未開課,那么會造成無法插入主鍵(學號+課程名)的值,因此這種關(guān)系模式還存在插入異常的問題;當刪除了SCD表中數(shù)據(jù)庫基礎(chǔ)這門課程的信息時,同時也會刪除相關(guān)任課教師的信息,因此這種關(guān)系模式又存在刪除異常的問題;當某個教師的職稱發(fā)生變化時,除了要更新SCD表中的職稱信息,還需要更新教師表中的職稱信息,這樣不僅加大了維護工作量,還容易造成表間的數(shù)據(jù)不一致問題,因此這種關(guān)系模式還存在更新異常的問題。
所以,要將關(guān)系數(shù)據(jù)模型進行規(guī)范化。
3.關(guān)系規(guī)范化的方法
關(guān)系規(guī)范化的基本方法是逐步消除關(guān)系模式中不合適的數(shù)據(jù)依賴,使關(guān)系模式達到某種程度的分離,也就是說,不要將若干事物混在一起,而要彼此分開,用一個關(guān)系表示一事或一物,所以,規(guī)范化的過程也被認為是“單一化”的過程。
規(guī)范化是以函數(shù)相關(guān)性理論為基礎(chǔ)的,其中最重要的是函數(shù)依賴,其定義如下。
給定一個關(guān)系模式R,有屬性(或?qū)傩越M)A和B,如果B的每個值都與A的唯一確定值對應,則稱B函數(shù)依賴于A,A被稱為決定因素。如果B的每個值完全能由A值決定,則稱B完全函數(shù)依賴于A。如果B的每個值只依賴于A中的部分屬性,則稱B部分函數(shù)依賴于A。如果關(guān)系模式R中有屬性A、B、C,C函數(shù)依賴于B,B函數(shù)依賴于A,則稱C傳遞函數(shù)依賴于A。
下面通過任務1.5.2~任務1.5.5來認識各級范式。
任務1.5.2 認識第一范式(1NF)
設(shè)R是一個關(guān)系模式,如果R中的每個屬性都是不可分解的,則稱R是第一范式,記為R∈1NF。
1NF要求不能表中套表。它是對關(guān)系模式最基本的要求,數(shù)據(jù)庫模式中的所有關(guān)系模式都必須是1NF。
請思考:
前面提到的關(guān)系模式SCD(學號,姓名,……)是否是1NF?
【例1-4】判斷如表1-11所示的SC1表是否是1NF?若不是,如何修改?
分析:該SC1表不是1NF,因為每個元組的課程名中都包含了若干門課程,是可以分解為若干單門課程的。對于這樣的關(guān)系模式,修改某個學生的選課情況,涉及該學生原來的所有課程名,這是很不方便的。為避免這樣的問題,可以將選修關(guān)系SC1的課程名屬性拆開,形成如表1-12所示的SC2關(guān)系形式。顯然,SC2∈1NF。
表1-11 SC1

表1-12 SC2

任務1.5.3 認識第二范式(2NF)
1.第二范式的含義
如果關(guān)系模式R是1NF,且每個非鍵屬性都完全函數(shù)依賴于鍵屬性,則稱R是第二范式,記為R∈2NF。
如果關(guān)系模式中存在部分函數(shù)依賴,則會造成插入異常。在2NF中,不存在非鍵屬性對鍵屬性的部分函數(shù)依賴關(guān)系,因此2NF解決了插入異常問題。
【例1-5】 判斷關(guān)系模式“SCD(學號,姓名,課程名,成績,學院名稱,院長)”是否是2NF?為什么?
分析:該關(guān)系模式是1NF,但不是2NF。因為該關(guān)系模式的鍵是(學號+課程名),對于非鍵屬性,如姓名、學院名稱、院長來說,它們只依賴于學號,而與課程名無關(guān)。
那么,要如何將其轉(zhuǎn)化為2NF呢?
2.轉(zhuǎn)化為2NF的方法
將非2NF的關(guān)系模式轉(zhuǎn)化為2NF的辦法是消除部分函數(shù)依賴,將其分解為若干個2NF關(guān)系模式。消除的方法如下。
1)把關(guān)系模式中對鍵完全函數(shù)依賴的非主屬性與決定它們的鍵放在一個關(guān)系模式中。
2)把對鍵部分函數(shù)依賴的非主屬性和決定它們的主屬性放在一個關(guān)系模式中。
3)如果分解后的新模式仍不是2NF,則繼續(xù)按照前面的方法進行分解,直到達到要求。
在關(guān)系模式SCD中,成績完全函數(shù)依賴于鍵(學號+課程名),可將它們放在一個關(guān)系模式中,如:SD(學號,姓名,學院名,院長);姓名、學院名、院長只依賴于學號,可將它們放在另一個關(guān)系模式中,如:SC(學號,課程名,成績)。分解后的關(guān)系模式SD和SC中都不存在部分函數(shù)依賴,所以它們都是2NF。
3.2NF存在的問題
2NF雖然消除了數(shù)據(jù)的插入異常,但仍然存在其他存儲問題。例如:關(guān)系模式SD既包含學生信息,又包含學院信息,所以仍存在問題,須進一步分解。這就需要更高級別的范式。
任務1.5.4 認識第三范式(3NF)
1.第三范式的含義
如果關(guān)系模式R是2NF,且沒有一個非鍵屬性傳遞依賴于鍵,則稱R是第三范式,記為R∈3NF。
如果關(guān)系模式中存在傳遞函數(shù)依賴,則會造成刪除異常。在3NF中,消除了傳遞函數(shù)依賴,因此3NF解決了數(shù)據(jù)的刪除異常問題。
【例1-6】 判斷關(guān)系模式“SD(學號,姓名,學院名稱,院長)”是否是3NF?為什么?
分析:該關(guān)系模式是2NF,但不是3NF。因為該關(guān)系模式中存在著:主鍵學號決定非鍵屬性學院名(學號→學院名)、學院名決定院長(學院名→院長),即院長傳遞函數(shù)依賴于學號,因此關(guān)系模式SD不是3NF。
那么,要如何將其轉(zhuǎn)化為3NF呢?
2.轉(zhuǎn)化為3NF的方法
將非3NF的關(guān)系模式轉(zhuǎn)化為3NF的辦法是消除傳遞函數(shù)依賴,將其進一步分解為若干個獨立的第三范式關(guān)系模式。消除的方法如下。
1)把直接對鍵函數(shù)依賴的非主屬性與決定它們的鍵放在一個關(guān)系模式中。
2)把造成傳遞函數(shù)依賴的決定因素連同被它們決定的屬性放在一個關(guān)系模式中。
3)如果分解后的新模式不是3NF,則繼續(xù)按照前面的方法進行分解,直到達到要求。
在關(guān)系模式SD中,姓名、學院名直接依賴主屬性學號,可將它們放在一個關(guān)系模式中,如:S(學號,姓名,學院名);學院名決定院長,學院名是造成傳遞函數(shù)依賴的決定因素,將它們放在另一個關(guān)系模式中,如:D(學院名,院長)。
可以看出,關(guān)系模式S和D各自描述單一的現(xiàn)實事物,都不存在傳遞依賴關(guān)系,所以它們都是3NF。
3.3NF存在的問題
一個關(guān)系模式達到3NF,基本解決了異常問題,但還不能徹底解決數(shù)據(jù)冗余問題。因為3NF不能很好地處理模型中含有多個候選鍵和候選鍵是組合項的情況,因此需要更強的范式。
【課堂實踐4】
假設(shè)某商業(yè)集團數(shù)據(jù)庫中有1個關(guān)系模式R(商店編號,商品編號,數(shù)量,部門編號,負責人),如果規(guī)定:每個商店的每種商品只在一個部門銷售;每個商店的每個部門只有一個負責人;每個商店的每種商品只有一個庫存數(shù)量。
1)寫出關(guān)系模式R的基本函數(shù)依賴集。
2)找出關(guān)系模式R的候選鍵。
3)關(guān)系模式R最高已經(jīng)達到第幾范式?為什么?
4)如果R不屬于3NF,請將R分解成3NF。
任務1.5.5 了解Boyce-Codd范式(BCNF)
1.Boyce-Codd范式的含義
Boyce-Codd范式(BCNF)也稱為擴充的第三范式或增強第三范式。
如果關(guān)系模式R中的所有決定因素都是鍵,則稱R是BCNF。BCNF消除了關(guān)系中冗余的鍵,由BCNF的定義,可以得到以下結(jié)論。
1)所有非主屬性對每個鍵完全函數(shù)依賴。
2)所有主屬性對每個不包含它的鍵完全函數(shù)依賴。
3)沒有任何屬性完全函數(shù)依賴于非鍵的任何一組屬性。
可以證明,若R是BCNF,則R肯定是3NF。但若R是3NF,則R不一定是BCNF。
例如:學生關(guān)系模式S(學號,姓名,學院名)不僅是3NF,還是BCNF。
分兩種情況進行分析。一種情況假設(shè)姓名可以有重名,則學號是該模型唯一決定因素,它又是鍵,所以關(guān)系模式S是BCNF。另一種情況假設(shè)姓名沒有重名,則學號、姓名都是候選鍵,且除候選鍵以外,該模型沒有其他決定因素,所以關(guān)系模式S仍是BCNF。
【例1-7】 有關(guān)系模式STJ(學生,教師,課程),假設(shè):
1)每位教師只教一門課程。
2)一門課程由多位教師講授。
3)對于每門課,每個學生的講課教師只有一位。請判斷STJ是不是BCNF。
分析:由語義可知,關(guān)系模式STJ具有的函數(shù)依賴是:(學生,課程)→教師,教師→課程,(學生,教師)→課程,如圖1-7所示。

圖1-7 非BCNF實例
關(guān)系模式STJ有兩個候選鍵(學生,課程)和(學生,教師),由于沒有任何非主屬性對鍵傳遞依賴或部分依賴,因此模式STJ是3NF。但它不是BCNF,因為教師決定課程,教師是課程的決定因素,而教師這一單一屬性不是鍵,因此,模式STJ不是BCNF。
2.轉(zhuǎn)化為BCNF的方法
將3NF的關(guān)系模式分解為BCNF的方法如下。
1)在3NF關(guān)系模式中,去掉一些主屬性,只保留主鍵,使它們只有唯一的候選鍵。
2)把去掉的主屬性,分別同各自的非主屬性組成新的關(guān)系模式。
3)檢查分解后的新模式,如果仍不是BCNF,則繼續(xù)按照前面的方法進行分解,直到達到要求。
根據(jù)以上方法,可將關(guān)系模式STJ分解為ST(學生,教師)和TJ(教師,課程)兩個關(guān)系模式。
3.BCNF存在的問題
在數(shù)據(jù)庫設(shè)計中,以達到3NF作為主要目標。當然,能夠達到BCNF更好,但從理論上說,達到BCNF有時會破壞原來關(guān)系模式的一些固有特點。
例如,設(shè)有關(guān)系模式R(S,T,V),存在的函數(shù)依賴有(S,T)→V,V→S。
可以驗證,該模型是3NF,但不是BCNF。無論將R如何分解,都將損失函數(shù)依賴(S,T)→V。
任務1.5.6 掌握四種范式的關(guān)系
縱觀四種范式,可以發(fā)現(xiàn)它們之間存在著這樣的關(guān)系:BCNF?3NF?2NF?1NF。從范式所允許的函數(shù)依賴方面進行比較,它們之間有如圖1-8所示的關(guān)系。

圖1-8 四種范式的比較
一般情況下,沒有異常弊病的數(shù)據(jù)庫設(shè)計是好的數(shù)據(jù)庫設(shè)計,一個不好的關(guān)系模式也總是可以通過分解轉(zhuǎn)換成好的關(guān)系模式的集合。但是在分解時要全面衡量,綜合考慮,視實際情況而定。對于那些只要求查詢而不要求插入、刪除等操作的系統(tǒng),幾種異常現(xiàn)象的存在并不影響數(shù)據(jù)庫的操作。這時便不宜過度分解,否則當要進行整體查詢時,需要更多的多表連接操作,這樣有可能得不償失。
在實際應用中,最有價值的是3NF和BCNF,在進行關(guān)系模式的設(shè)計時,通常分解到3NF就足夠了。
【課堂練習】
一、填空題
1.數(shù)據(jù)庫系統(tǒng)各類用戶對表的各種操作請求(數(shù)據(jù)定義、查詢、更新及各種控制)都是由一個復雜的軟件來完成的,這個軟件叫作________。
2.DBMS(數(shù)據(jù)庫管理系統(tǒng))通常提供授權(quán)功能來控制不同的用戶訪問數(shù)據(jù)庫中數(shù)據(jù)的權(quán)限,其目的是為了數(shù)據(jù)庫的________。
3.在概念模型中,通常用實體-聯(lián)系圖表示數(shù)據(jù)的結(jié)構(gòu),其三個主要的元素是________、________和________。
4.學校中有若干個系和若干位教師,每位教師只能屬于一個系,一個系可以有多位教師,系與教師的聯(lián)系類型是________。
5.數(shù)據(jù)庫系統(tǒng)中所支持的主要邏輯模型有層次模型、關(guān)系數(shù)據(jù)模型、________和面向?qū)ο竽P汀?/p>
6.聯(lián)系兩個表的關(guān)鍵字稱為________。
7.關(guān)系中主鍵的取值必須唯一且非空,這條規(guī)則是________完整性規(guī)則。
8.關(guān)系模式是對關(guān)系結(jié)構(gòu)的定義,是對關(guān)系________的描述。
9.對于1:1的聯(lián)系,________均是該聯(lián)系關(guān)系的候選鍵。
10.對于1:n的聯(lián)系,關(guān)系的鍵是________。
11.對于m:n的聯(lián)系,關(guān)系的鍵是________。
12.關(guān)系完整性約束包括________完整性、參照完整性和用戶自定義完整性。
二、選擇題
1.數(shù)據(jù)庫管理技術(shù)的發(fā)展階段不包括( )。
A.數(shù)據(jù)庫系統(tǒng)管理階段
B.人工管理階段
C.文件系統(tǒng)管理階段
D.操作系統(tǒng)管理階段
2.數(shù)據(jù)處理進入數(shù)據(jù)庫系統(tǒng)階段,以下不是這一階段的優(yōu)點的是( )。
A.有很高的數(shù)據(jù)獨立性
B.數(shù)據(jù)不能共享
C.數(shù)據(jù)整體結(jié)構(gòu)化
D.有完備的數(shù)據(jù)控制功能
3.用于定義、撤銷和修改數(shù)據(jù)庫對象的語言是( )。
A.DDL
B.DML
C.DC
D.DEL
4.數(shù)據(jù)庫系統(tǒng)的出現(xiàn)使信息系統(tǒng)以( )為中心。
A.數(shù)據(jù)庫
B.用戶
C.軟件
D.硬件
5.在現(xiàn)實世界中,事物的一般特性在信息世界中稱為( )。
A.實體
B.實體鍵
C.屬性
D.關(guān)系鍵
6.實體-聯(lián)系圖(E-R圖)是( )。
A.現(xiàn)實世界到信息世界的抽象
B.描述信息世界的數(shù)據(jù)模型
C.對現(xiàn)實世界的描述
D.描述機器世界的數(shù)據(jù)模型
7.關(guān)系數(shù)據(jù)模型的數(shù)據(jù)結(jié)構(gòu)是( )。
A樹
B.圖
C.表
D.二維表
8.關(guān)系R和S進行自然連接時,要求R和S含有一個或多個公共( )。
A.元組
B.行
C.記錄
D.屬性
9.設(shè)屬性A是關(guān)系R的主屬性,則屬性A不能取空值,這是( )。
A.實體完整性規(guī)則
B.參照完整性規(guī)則
C.用戶自定義完整性規(guī)則
D.域完整性規(guī)則
三、簡答題
1.簡述數(shù)據(jù)、數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)和數(shù)據(jù)庫系統(tǒng)的定義。
2.數(shù)據(jù)庫系統(tǒng)有哪些特點?
3.數(shù)據(jù)庫管理系統(tǒng)的主要功能有哪些?
4.在關(guān)系代數(shù)中,等值條件連接和自然連接的區(qū)別是什么?
5.試述關(guān)系數(shù)據(jù)模型的完整性規(guī)則。在參照完整性規(guī)則中,為什么外鍵屬性的值也可以為空?什么情況下才可以為空?
6.什么是關(guān)系規(guī)范化?關(guān)系規(guī)范化的目的是什么?關(guān)系規(guī)范化的基本方法是什么?1NF至BCNF,它們之間的關(guān)系是什么?
四、設(shè)計題
1.試給出三個實際情況的E-R圖,要求實體之間具有一對一、一對多、多對多各種不同的聯(lián)系。
2.某學院有若干系,每個系有若干班級和教研室,每個教研室有若干教師,每個班有若干學生,每個學生選修若干課程,每門課程可由若干學生選修。請使用E-R圖繪制該學院的概念模型。
3.某商品銷售公司有若干銷售部門,每個銷售部門有若干員工,銷售多種商品,所有商品由一個廠家提供,設(shè)計該公司銷售系統(tǒng)的E-R模型,并將其轉(zhuǎn)換為關(guān)系模式。
4.設(shè)關(guān)系模式SCT(學號,課程號,成績,教師名,教師地址)。如果規(guī)定:每個學生每學一門課程只有一個成績;每門課只有一個教師任教;每個教師只有一個地址(無同名教師)。
(1)寫出關(guān)系模式SCT的基本函數(shù)依賴集。
(2)找出關(guān)系模式SCT的候選鍵。
(3)試把SCT分解成2NF模式集,并說明理由。
(4)試把SCT分解成3NF模式集,并說明理由。
【課外實踐】
實踐任務1 繪制表示班級與學生關(guān)系的E-R圖
要求:
(1)確定班級實體和學生實體的屬性和鍵。
(2)確定班級和學生之間的聯(lián)系,給聯(lián)系命名并指出聯(lián)系的類型。
(3)確定聯(lián)系本身的屬性。
(4)繪制班級與學生關(guān)系的E-R圖。
(5)將E-R圖轉(zhuǎn)化為表,寫出表的關(guān)系模式并標明各自的主鍵或外鍵。
實踐任務2 繪制表示顧客與商品關(guān)系的E-R圖
要求:
(1)確定顧客實體和商品實體的屬性和鍵。
(2)確定顧客和商品之間的聯(lián)系,給聯(lián)系命名并指出聯(lián)系的類型。
(3)確定聯(lián)系本身的屬性。
(4)繪制顧客與商品關(guān)系的E-R圖。
(5)將E-R圖轉(zhuǎn)化為表,寫出表的關(guān)系模式并標明各自的主鍵或外鍵。
實踐任務3 繪制表示學校與校長關(guān)系的E-R圖
要求:
(1)確定學校實體和校長實體的屬性和鍵。
(2)確定學校和校長之間的聯(lián)系,給聯(lián)系命名并指出聯(lián)系的類型。
(3)確定聯(lián)系本身的屬性。
(4)繪制學校與校長關(guān)系的E-R圖。
(5)將E-R圖轉(zhuǎn)化為表,寫出表的關(guān)系模式并標明各自的主鍵或外鍵。
實踐任務4 繪制房地產(chǎn)交易中客戶、業(yè)務員和合同間關(guān)系的E-R圖
要求:
(1)確定客戶實體、業(yè)務員實體和合同實體的屬性和鍵。
(2)確定客戶、業(yè)務員和合同三者之間的相互聯(lián)系,給聯(lián)系命名并指出聯(lián)系類型。
(3)確定聯(lián)系本身的屬性。
(4)繪制客戶、業(yè)務員和合同三者關(guān)系的E-R圖。
(5)將E-R圖轉(zhuǎn)化為表,寫出表的關(guān)系模式并標明各自的主鍵或外鍵。
實踐任務5 確定表中的關(guān)鍵字
已知部門表和員工表,分別如表1-13和表1-14所示。
表1-13 部門表

表1-14 員工表

要求:
(1)確定部門表和員工表中的候選鍵(單屬性或組合屬性),并陳述理由。
(2)在候選鍵中確定部門表和員工表的主鍵。
(3)確定部門表和員工表中的共有屬性。
(4)指出哪個表中的哪個屬性是外鍵。
(5)確定哪個表是主表,哪個表是從表。
(6)解釋部門表和員工表是如何通過關(guān)鍵字實現(xiàn)數(shù)據(jù)完整性的。
實踐任務6 規(guī)范化數(shù)據(jù)
已知項目表1、項目表2、職員表和項目表3,分別如表1-15~表1-18所示。
表1-15 項目表1

表1-16 項目表2

表1-17 職員表

表1-18 項目表3

要求:
(1)判斷項目表1是否滿足1NF的條件,并說明理由。
(2)判斷項目表2是否滿足2NF的條件,并說明理由。
(3)判斷職員表是否滿足3NF的條件,并說明理由。
(4)判斷項目表3是否滿足BCNF的條件,并說明理由。
(5)將項目表1轉(zhuǎn)換成滿足1NF條件的表。
(6)將項目表2轉(zhuǎn)換成滿足2NF條件的表。
(7)將職員表轉(zhuǎn)換成滿足3NF條件的表。
(8)將項目表3轉(zhuǎn)換成滿足BCNF條件的表。
(9)簡述規(guī)范化數(shù)據(jù)帶來的不利影響。