正規化的概念
何謂 正規化(Normalization)? 就是結構化分析與設計中,建構「資料模式」所運用的一個技
術。
其目的是為了降低資料的「重覆性」 與避免 「更新異常」 的情況發生。因此,就必須將整個資料表中 重複性的資料刷除,否則在關聯表中會造成造成新增異常、刪除異常、修改異常的狀況發生。
一般而言,正規化的精神就是讓資料庫中重複的欄位資料減到最少,並且能快速的找到資料,以提高
關聯性資料庫的效能。
【目的】
1.降低資料重複性(Data Redundancy)
2.避免资料更新異常(Anomalies)
正規化的規則
資料庫在正規化時會有一些規則,並且每條規則都稱為「正規形式」。
如果符合第一條規則,則資料庫就稱為「第一正規化形式(1NF)」。
如果符合前二條規則,則資料庫就稱為「第二正規化形式(2NF)」。
雖然資料庫的正規化最多正規化最多可以進行到可以進行到第五正規化形式,但是在實務上,
3NF 被視為大部分應用程式所需的最高階正規形式。
從上圖中,我們可以清楚得知,正規化是循序漸進的過程,亦即資料表必須滿足第一正規化的條件,
當滿足第一正規化的條件之後,才能進行第二正規化,換言之,第二正規化必須建立在符合第一正規
化的資料表上,依此類推。
正規化步驟
在資料表正規化的過程(INF到BCNF)中,每一個階段都是以欄位的「相依性」做為分割資料表的依據。
簡易型完成三階正規化作法
簡易型完成三階正規化作法
- 先將所有的欄位由左到右全部列出
- 找出不會重覆的欄位當
Key值欄位,並列在第一個順位 - 列出每個欄位與
Key值欄位的相依性(絶對相依或相對相依) - 將相對相依的欄位移出成主檔
- 刪除相對相依的欄位
資料來源:
Google 搜尋
以客戶訂單表頭檔為例
- 將其表頭所有的欄位由左到右全部列出
| 訂單編號 | 訂單日期 | 報價單號 | 業務編號 | 業務姓名 | 客戶編號 | 客戶名稱 | 聯絡人 | 交貨日期 | 公司電話 | 公司傳真 | 送貨地址 | 送貨方式 | 付款方式 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- 找出不會重覆的欄位(唯一值)當
Key值欄位,並列在第一個順位
| 🟥訂單編號 | 訂單日期 | 報價單號 | 業務編號 | 業務姓名 | 客戶編號 | 客戶名稱 | 聯絡人 | 交貨日期 | 公司電話 | 公司傳真 | 送貨地址 | 送貨方式 | 付款方式 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-
去跟訂單編號產生關連做拉線,列出每個欄位與
Key值欄位的相依性(絶對相依或相對相依)
/img-20260810161812720.png)
- 黃色欄位都與與訂單編號是絕對相依
- 粉紅色欄位都是與訂單編號是相對相依
-
將相對相依的欄位移出成主檔
/img-20260810162425492.png)
- 業務編號與業務姓名為絕對相依,所以業務姓名移出連同業務編號也須一同移除,移除後變成員工主檔
- 客戶編號與客戶名稱為絕對相依,所以客戶編號、客戶名稱、聯絡人、公司電話、公司傳真移出連同客戶編號也須一同移除,移除後變成客戶主檔
-
刪除所有相對相依的欄位
/img-20260810164334031.png)
刪除所有相對相依的欄位,然後透過- 業務編號去跟員工主檔的員工編號去做關聯,可取得員工(業務)姓名。
- 客戶編號去跟客戶主檔的客戶編號去做關聯,可取得客戶姓名、聯絡人、公司電話、公司傳真。
最後真正要設計的欄位就是:
/img-20260810164949463.png)
這樣做完就代表完成第三階正規化的工作
/img-20260810101140927.png)
/img-20260810101424293.png)
/img-20260810154858957.png)