官术网_书友最值得收藏!

1.6 關系數據庫的規范化

在設計關系數據庫時,不是隨便哪種關系模式設計方案都可行,更不是任何一種關系模式都可以投入應用,一個好的關系模式必須滿足一定的規范化要求。用戶在設計關系數據庫時,每一個關系都要遵守不同的規范要求。不同的規范化程度可用范式來衡量。范式(Normal Form)是符合某一種級別的關系模式的集合,是衡量關系模式規范化程度的標準,符合標準的關系才是規范化的。范式可以分為多個等級:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF)、第四范式(4NF)、第五范式(5NF)等。滿足最低要求的為第一范式,在第一范式基礎上進一步滿足一些要求的為第二范式,其余以此類推。通常情況下,數據規范到第三范式就可以了。將這三個范式應用到數據庫設計中,能夠減少數據冗余,消除插入異常、更新異常和刪除異常。

1.6.1 第一范式(1NF)

如果關系模式R中所有的屬性都是不可分解的,則稱該關系模式R滿足第一范式(First Normal Form),簡稱1NF,記作R∈1NF。

表1-2中的聯系方式屬性可以分成系別和班級兩個屬性,故不符合1NF的要求。如何將該表規范成1NF呢?可以有兩種方法。一種方法是將聯系方式屬性展開,如表1-3所示。另一種方法是將該關系分解為兩個關系,如表1-4和表1-5所示。在關系數據庫中,1NF是對關系模式設計的最基本要求。

表1-2 學生信息表

表1-3 學生信息表

表1-4 學生信息表

表1-5 聯系方式表

1.6.2 第二范式(2NF)

在學習2NF之前需要先了解一下函數依賴、完全函數依賴和部分函數依賴的概念。

通俗地講,假設A、B是關系模式R中的兩個屬性或屬性組合,A的值一旦給定,B的值就能唯一確定,稱A函數確定B或B函數依賴于A,記作A→B。例如,對于教學關系R(學號,姓名,年齡,性別,系名,系主任,課程名,成績),其中學號屬性的值一旦確定了,姓名屬性的值也就唯一確定了,姓名函數依賴于學號,記作:學號→姓名。此關系中的函數依賴還有:學號→年齡,學號→性別,學號→系名,學號→系主任,系名→系主任,(學號,課程名)→成績,(學號,姓名)→系名,等等。

如果A→B是R的一個函數依賴,且對于A的任何一個真子集A’,A’→B都不成立,則稱A→B是完全函數依賴。反之,如果A’→B成立,則稱A→B是部分函數依賴。例如,在教學關系R中,對于(學號,課程名)→成績這個函數依賴,學號→成績和課程名→成績都不成立,所以(學號,課程名)→成績是完全函數依賴。而對于(學號,姓名)→系名這個函數依賴,學號→系名成立,所以(學號,姓名)→系名是部分函數依賴。

那么什么是第二范式(2NF)呢?

如果一個關系模式R∈1NF,且R中的每一個非主屬性都完全函數依賴于碼,則稱該關系模式R滿足第二范式(Second Normal Form),簡稱2NF,記作R∈2NF。

例如表1-3所示的學生信息表,學號能唯一地標識出該表中的每一行,所以學號是該表的主關鍵字。學號為“X171001”的學生姓名是“張無忌”,學生姓名完全能由學號來決定,也就是說有一個學號就會有且只有一個姓名與它對應,則稱姓名完全函數依賴學號,也可以說學號決定了姓名。同理,表1-3中的性別、年齡、系別、班級屬性也完全函數依賴于學號,符合2NF的要求。

2NF是在1NF的基礎上建立起來的,要求實體的非主屬性必須完全依賴于主碼,不能存在僅依賴主碼一部分的屬性,如果存在則要把這個屬性和主碼的這一部分分離出來形成一個新的關系。例如,學生成績表(學號,姓名,課程號,課程名,成績)中,“學號”和“課程號”字段組成主碼,“成績”完全依賴于該主碼,但是“姓名”和“課程名”都只是部分依賴于主碼,“姓名”可以由“學號”確定,并不需要“課程號”,而“課程名”是由“課程號”決定,并不依賴于“學號”。所以該關系模式就不符合2NF,可以將其分解為三個符合2NF的關系模式:

(1)學生信息表(學號,姓名)

(2)課程信息表(課程號,課程名)

(3)成績表(學號,課程號,成績)

不滿足2NF的關系會出現諸如插入異常、刪除異常和修改復雜等問題。

1.6.3 第三范式(3NF)

如果一個關系模式R∈2NF,且R中的每個非主屬性都不傳遞函數依賴于碼,則稱該關系模式R滿足第三范式(Third Normal Form),簡稱3NF,記作R∈3NF。

所謂傳遞函數依賴是指假設A、B、C是關系模式R中的3個屬性或屬性組合,如果A→B, B A,B A,B→C,則稱C對A傳遞函數依賴,傳遞函數依賴記作A→C。

例如,學生信息表(學號,姓名,年齡,班級號,班主任)中,“班主任”依賴于“學號”。“班主任”對“學號”的依賴,是因為“班主任”依賴于“班級號”,“班級號”依賴于“學號”而產生的。這樣就構成了傳遞依賴,因此不符合3NF。

要想讓這個關系模式符合3NF,可以將其分解為兩個關系模式:

(1)學生信息表(學號,姓名,年齡,班級號)

(2)班級信息表(班級號,班主任)

主站蜘蛛池模板: 仪征市| 铜梁县| 六盘水市| 昌宁县| 德庆县| 密云县| 开封县| 沂源县| 吉安县| 湖口县| 莱阳市| 宝山区| 喀喇沁旗| 竹溪县| 平南县| 茶陵县| 景德镇市| 阳谷县| 敖汉旗| 乌恰县| 淅川县| 正镶白旗| 剑阁县| 云霄县| 志丹县| 嘉定区| 龙胜| 大悟县| 大悟县| 崇文区| 桑植县| 湟中县| 英超| 凌源市| 连云港市| 孟州市| 浠水县| 南召县| 封开县| 老河口市| 泽普县|