- MySQL數據庫技術與應用
- 張素青 翟慧 黃靜
- 1892字
- 2019-10-23 17:45:23
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)班級信息表(班級號,班主任)
- 數據庫基礎教程(SQL Server平臺)
- Python數據分析與挖掘實戰
- Live Longer with AI
- Learn Unity ML-Agents:Fundamentals of Unity Machine Learning
- Spark大數據分析實戰
- HikariCP連接池實戰
- 數據庫技術及應用
- Augmented Reality using Appcelerator Titanium Starter
- The Natural Language Processing Workshop
- Python 3爬蟲、數據清洗與可視化實戰
- Kubernetes快速進階與實戰
- C# 7 and .NET Core 2.0 High Performance
- Working with OpenERP
- 零基礎學SQL
- SQL必知必會(第四版)