資料庫-正規化
資料庫-正規化
資料來源: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
重點在於將每個欄位中的多筆資料轉換為單一資料
以下表為例:
可以發現,每筆資料都含有2筆以上的結果,這就違反了一階正規化。
經過一階正規化後,上表會變成
好,至此第一階正規化就完成了。
所以,一階正規化的規則如下:
(1)每筆資料的每個欄位(field)只能有一筆資料。
(2)沒有任何兩筆或兩筆以上資料是完全重複。
(3)資料表中有「主鍵」,而且其他所有欄位都依附於主鍵。
以上表為例,此時的主鍵是由(學號+課程代碼)組合而成。
2. 2NF
完成1NF後,發現資料表中有許多重複性的資料,不但浪費儲存空間,而且會造成資料處理時的異常狀況。所以,必須進行2NF來處理上述問題。
二階正規化的規則如下:
(1)符合1NF。
(2)每一個非鍵值欄位必須「完全相依」於主鍵。
備註:
相對於完全相依的稱為「部分相依」,部分相依的發生狀況通常在於主鍵由多個欄位組成時發生,也就是說某些資料只與主鍵中的部分欄位有關,而與另一部份的欄位無關。
以上表為例,課程的必選修與與課程代碼有關,而與學號無關。
(3)分割資料表。
備註:就是將部分相依的欄位分割,另外組成新的資料表。
由表
主鍵是由(學號+課程代碼)組成,但是,
1.姓名和性別只與學號有關,
2.課程名稱(包含學分數、必選修、教師編號、教師姓名)與課程代碼有關。
所以,必須將部分相依的欄位切割成為另張表格。
因此,上表將變成下列表格:
表一:學生資料表(學號、姓名、性別),其中學號為主鍵
表二:成績資料表(學號、課程代碼、成績) ,其中(學號+課程代碼)為主鍵
表三:課程資料表(課程代碼、課程名稱、學分數、必選修、教師編號、教師姓名),其中,課程代碼為主鍵
此時可以發現,除了表三外,表一及表二已經無法再進行資料切割,因此表一及表二都已經符合2NF、3NF及BCNF。
3.3NF
三階正規化的規則如下:
(1)符合2NF。
(2)各欄位與主鍵之間沒有遞移相依的關係。
備註:
遞移相依 ─ 資料表中有「與主鍵無關」的相依性
(3)分割資料表。
以上表三為例
表三:課程資料表(課程代碼、課程名稱、學分數、必選修、教師編號、教師姓名),其中,課程代碼為主鍵
可以發現,教師姓名只與教師編號有關,而與課程代碼無關。也就是說,教師姓名直接相關於教師編號,且間接相關於課程代碼。
因此,必須將表三分割成兩個資料表,並利用外部鍵(Foreign Key,FK)來連接兩個資料表。
此時表三將變成
表三-1:課程資料表(課程代碼、課程名稱、學分數、必選修、教師編號*),其中,課程代碼為主鍵
表四;教師資料表(教師編號、教師姓名),其中,教師編號為主鍵
至此,從原始資料表到最後的四張表格(表一、表二、表三-1及表四),就算是已經完成1NF到3NF的動作。
4.BCNF(Boyce-Codd NF)
使用時機:如果資料表的主鍵是由多個欄位組成的,則有可能再執行BCNF。
BCNF規則:
(1)符合3NF。
(2)主鍵中的欄位不可相依於其他欄位。
以表二為例,
表二:成績資料表(學號、課程代碼、成績) ,其中(學號+課程代碼)為主鍵
成績相依於(學號+課程代碼),但是學號沒有相依於成績,課程代碼也沒有相依於成績,表示表二有符合BCNF的形式。
|
One thought on “資料庫-正規化”
資料庫/資料表 正規化- 通訊錄系統 範例
DB/ Table SQL
規劃/設計 教學
https://bit.ly/3IZW5Oc