正規化(Normalization)


在建立資料表前,先來談談正規化(Normalization),在關聯式資料庫,若想提升效率,在設計資料庫時可利用正規化來協助設計資料表的結構。

什麼是正規化?

正規化是一種標準處理程序,來決定關聯式資料庫該擁有哪些屬性,並建立良好的結構關聯表,以提高關聯式資料庫的效能。
正規化的過程為循序漸進,資料表須滿足第一正規化的條件下,才能進行第二正規化,以此類推。反過來說,第三正規化一定得符合第二正規化的資料表上,第二正規化一定符合第一正規化的資料表上。因此,第一正規化的資料表為所有正規化的基礎


目的

  • 去除重複性
    建立沒有重複資料的關聯表,提高資料維護效率以及節省重複資料的儲存空間
  • 去除不一致相依性
    若關聯表有不一致的相依性,會造成在增刪修時發生異常情況

型式

  • 第一階正規化(First Normal Form)
    第一正規化可簡稱 1NF,在此階段要處理的是「資料表內不允許有『多值屬性』及『組合屬性』存在」以及單一鍵值,一個栗子

    在上述表格內,課程代號及課程名稱擁有多值屬性,如此一來不符合1NF,第一正規化如前面所敘,要處理掉多值屬性,並將每個屬性處理為一筆紀錄,使得每個欄位中都只儲存單一值。
    首先將多重屬性分割為單一紀錄,將資料整理為每個欄位都只有單一值,並加入主鍵(ID)獨立成單筆紀錄。

    雖然增加不少紀錄,但在往後在查詢或維護時會方便快速許多。

    何為主鍵?
    資料表內需具有 Primary Key 作為該比紀錄的代表,而 Primary Key 具有唯一性,在這個案例「ID」可為主鍵(Primary Key)

  • 第二階正規化(Second Normal Form)
    第二正規化可簡稱 2NF,在符合第一正規化下,去除部分相依性以及單純化關聯表,分割同類型資料儲存於新的關聯表。
    延續上個栗子,首先將主鍵(課程代號)分割為新的資料表為課程。

    接著將重複的課程名稱去除,因有課程代號主鍵就可知道課程名稱,而學生資料表內就無需包含課程名稱,保持同類型資料儲存於一張資料表的規則,完成第二正規化。

  • 第三階正規化(Third Normal Form)
    第三正規化可簡稱 3NF,在符合第二正規化下,保持各欄位與 Primary Key 間沒有間接相依的關係。延續上個例子,並增加課程教室與教室位置欄位讓栗子可以做到 3NF

    按照1NF規則處理如下

    接著依2NF規則處理分割成同類型資料表

    到目前為止,和原本栗子的處理方式相同,不同的是多了課程教室與教室位置的相依性,現在我們可以採用3NF的規則來處理,在將教室位置切割成新的資料表。

    將大樓名稱的相依性切割後,在整理一次課程資料表

    如此一來就完成第三正規化,而欄位彼此之間的相依性為
    姓名→學號→課程代號←課程教室←大樓編號←大樓名稱

  • 第四階正規化(Fourth Normal Form)

  • 第五階正規化(Fifth Normal Form)
    雖然有4NF及5NF,但在實務的設計和應用上到3NF已經很足夠。

  • Boyce-Codd(BCNF)
    BCNF可視為比3NF更嚴格的3NF,規則為保證關聯表內屬性都相依於候選鍵,所以BCNF處理的關聯表至少擁有兩個或兩個以上的候選鍵,而這次的例子在3NF同時也符合BCNF。

#Normalization #正規化 #MS SQL
MS SQL 內功心法
MS SQL 基礎介紹及語法教學






Related Posts

記一次 Leetcode 刷題體悟 - Valid Number

記一次 Leetcode 刷題體悟 - Valid Number

Po-Jen
容器生命週期與指令整理

容器生命週期與指令整理

Nacho
七天學會 swift - 基礎篇 Day2

七天學會 swift - 基礎篇 Day2

eric236431


Comments