資料庫-正規化

資料庫-正規化

資料庫-正規化

 

資料來源:http://elearn.bljcchen.twgg.org/home1012/database/db10


正規化(Normalization)

「資料模式」建構所運用的一個技術,其目的是為了降低資料的「重覆性」與避免「更新異常」的情況發生
 
一般而言,正規化的精神就是:
1.檢少資料庫中重複的欄位資料
2.維持資料庫的整合性
3.提高關聯性資料庫的效能
 
正規化共可分為6個階段,分別是:
1. 1NF(First Normal Form)
2. 2NF(Second Normal Form)
3. 3NF(Third Normal Form)
4. BCNF(Boyce-Codd Normal Form)  ← 大多數資料庫只需執行到 BCNF就足夠
5. 4NF(Fourth Normal Form)
6. 5NF(Fifth Normal Form)
 
底下將分階段簡單敘明:
 
1. 1NF
重點在於將每個欄位中的多筆資料轉換為單一資料
以下表為例:
學號 姓名 性別 課程代碼 課程名稱 學分數 必選修 成績 教師編號 教師姓名
001 A001 X001
X002
程式語言
網頁設計
3
3

88
72
T001
T002
Te001
Te002
002 A002 X002
X003
X005
網頁設計
計概
網路教學
3
2
3


78
81
76
T002
T005
T007
Te002
Te005
Te007
可以發現,每筆資料都含有2筆以上的結果,這就違反了一階正規化。
經過一階正規化後,上表會變成
學號 姓名 性別 課程代碼 課程名稱 學分數 必選修 成績 教師編號 教師姓名
001 A001 X001 程式語言 3 88 T001 Te001
001 A001 X002 網頁設計 3 72 T002 Te002
002 A002 X002 網頁設計 3 78 T002 Te002
002 A002 X003 計概 2 81 T005 Te005
002 A002 X005 網路教學 3 76 T007 Te007
好,至此第一階正規化就完成了。
所以,一階正規化的規則如下:
(1)每筆資料的每個欄位(field)只能有一筆資料。
(2)沒有任何兩筆或兩筆以上資料是完全重複。
(3)資料表中有「主鍵」,而且其他所有欄位都依附於主鍵。
 
以上表為例,此時的主鍵是由(學號+課程代碼)組合而成。
 


2. 2NF
完成1NF後,發現資料表中有許多重複性的資料,不但浪費儲存空間,而且會造成資料處理時的異常狀況。所以,必須進行2NF來處理上述問題。
二階正規化的規則如下:
(1)符合1NF。
(2)每一個非鍵值欄位必須「完全相依」於主鍵。
 
備註:
相對於完全相依的稱為「部分相依」,部分相依的發生狀況通常在於主鍵由多個欄位組成時發生,也就是說某些資料只與主鍵中的部分欄位有關,而與另一部份的欄位無關。
以上表為例,課程的必選修與與課程代碼有關,而與學號無關。
 

(3)分割資料表。

 
備註:就是將部分相依的欄位分割,另外組成新的資料表。
 


由表
學號 姓名 性別 課程代碼 課程名稱 學分數 必選修 成績 教師編號 教師姓名
001 A001 X001 程式語言 3 88 T001 Te001
001 A001 X002 網頁設計 3 72 T002 Te002
002 A002 X002 網頁設計 3 78 T002 Te002
002 A002 X003 計概 2 81 T005 Te005
002 A002 X005 網路教學 3 76 T007 Te007

主鍵是由(學號+課程代碼)組成,但是,

1.姓名和性別只與學號有關,
2.課程名稱(包含學分數、必選修、教師編號、教師姓名)與課程代碼有關。

所以,必須將部分相依的欄位切割成為另張表格。
因此,上表將變成下列表格:
表一:學生資料表(學號、姓名、性別),其中學號為主鍵
學號 姓名 性別
001 A001
002 A002
表二:成績資料表(學號、課程代碼、成績) ,其中(學號+課程代碼)為主鍵
學號 課程代碼 成績
001 X001 88
001 X002 72
002 X002 78
002 X003 81
002 X005 76
表三:課程資料表(課程代碼、課程名稱、學分數、必選修、教師編號、教師姓名),其中,課程代碼為主鍵
課程代碼 課程名稱 學分數 必選修 教師編號 教師姓名
X001 程式語言 3 T001 Te001
X002 網頁設計 3 T002 Te002
X003 計概 2 T005 Te005
X005 網路教學 3 T007 Te007
此時可以發現,除了表三外,表一及表二已經無法再進行資料切割,因此表一及表二都已經符合2NF、3NF及BCNF。
 
3.3NF
三階正規化的規則如下:
(1)符合2NF。
(2)各欄位與主鍵之間沒有遞移相依的關係。
 
備註:
遞移相依 ─ 資料表中有「與主鍵無關」的相依性
 

(3)分割資料表。
以上表三為例
表三:課程資料表(課程代碼、課程名稱、學分數、必選修、教師編號、教師姓名),其中,課程代碼為主鍵
課程代碼 課程名稱 學分數 必選修 教師編號 教師姓名
X001 程式語言 3 T001 Te001
X002 網頁設計 3 T002 Te002
X003 計概 2 T005 Te005
X005 網路教學 3 T007 Te007

可以發現,教師姓名只與教師編號有關,而與課程代碼無關。也就是說,教師姓名直接相關於教師編號,且間接相關於課程代碼。

 
因此,必須將表三分割成兩個資料表,並利用外部鍵(Foreign Key,FK)來連接兩個資料表。
此時表三將變成
表三-1:課程資料表(課程代碼、課程名稱、學分數、必選修、教師編號*),其中,課程代碼為主鍵
課程代碼 課程名稱 學分數 必選修 教師編號*
X001 程式語言 3 T001
X002 網頁設計 3 T002
X003 計概 2 T005
X005 網路教學 3 T007
表四;教師資料表(教師編號、教師姓名),其中,教師編號為主鍵
教師編號 教師姓名
T001 Te001
T002 Te002
T005 Te005
T007 Te007
至此,從原始資料表到最後的四張表格(表一、表二、表三-1及表四),就算是已經完成1NF到3NF的動作。
 
4.BCNF(Boyce-Codd NF)
使用時機:如果資料表的主鍵是由多個欄位組成的,則有可能再執行BCNF。
BCNF規則:
(1)符合3NF。
(2)主鍵中的欄位不可相依於其他欄位。
以表二為例,
表二:成績資料表(學號、課程代碼、成績) ,其中(學號+課程代碼)為主鍵
學號 課程代碼 成績
001 X001 88
001 X002 72
002 X002 78
002 X003 81
002 X005 76

成績相依於(學號+課程代碼),但是學號沒有相依於成績,課程代碼也沒有相依於成績,表示表二有符合BCNF的形式。

 

One thought on “資料庫-正規化

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *