正規化(Normalization)是關聯式資料庫在設計資料表時,用來消除資料儲存異常的處理方法。由於現實生活中,一張表單記錄的資料有很多,正規化的主要工作,就是要調整事實描述方式,將每個表單簡化到只描述一種事實,好讓資料井井有條得存放在電腦中,避免資料重複浪費儲存,並消除資料之間矛盾的情況,使資料庫運作起來更有效率,維護上也更容易。

對關聯式資料表來說,表單就是描述一個實體的資料,像員工這個實體會有員工姓名、員工職稱等資料,而正規化的過程,就是把一個實體的描述資料,透過一定的流程,將每張表單內容簡化,做到只單純描述一種事實為止。

正規化的過程,會調整資料表的組成結構,減少資料發生異常的機會,這些過程通常會逐步分為多個步驟,包含:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、BC正規化(Boyce-Codd Normal From,BCNF);除了上述這四種,還有第四正規化(4NF)、第五正規化(5NF)、DK正規化(Domain/key Normal Form)以及第六正規化(6NF),而每一次的正規化,都能減少一些造成資料異常的原因。一般的資料庫大多經過前四道手續,就可以完成正規化,而後四者則是用來處理特殊情況的表單,例如4NF及5NF,主要功能。是要消除多值相依(Multi-Value Dependency)的情況,例如一個產品有許多不同型號當作主鍵,但這些主鍵其實都是代表同一物件等問題。

將表單逐步正規化時要注意,每次表單正規化的結果,都必須滿足前一個正規化的條件。因此,除了第一正規化之外,當我們調整資料表架構之後,都要檢查產生出來的新結果,是不是滿足之前的正規化條件,如果沒有,那就要回到前一個步驟,重新檢查,然後再調整表單架構,直到滿足所有正規化條件為止。

我們可以參考圖例內的範例資料表,這是一家水果店的訂單表,以及正規化完成後的資料表,接著我們來參考這個表單試做前三種正規化,看看每次要做哪些事。


水果訂單正規化前後差異

將正規化前的水果訂單與完成後的表單相比,最明顯的地方,就是1張水果訂單變成3張表,包含水果訂單、貨品資料、客戶資料,且每個欄位也只有一筆資料,表單變這麼多張,乍看之下有些複雜,其實就如同之前說的,其實是將表單拆成很多張,並讓每張表單記載的資料更單純,像客戶清單,僅有辨識用的客戶編號,以及記錄客戶名稱等兩個欄位。

完成正規化之後,欄位總和變多了,而且貨品編號及客戶編號等欄位還重複,怎麼會說節省資料空間呢?在正規化前,每當陳先生下單時,就會使用2個欄位儲存客戶資料(客戶編號+客戶名稱);若是經過正規化,水果訂單內只會存放客戶編號,而省下1個欄位,當訂單日益增加時,就能省下越多的空間。


第一正規化確定主鍵
1NF的工作主要有三,首先要確認資料表中的主鍵。主鍵是辨識每筆資料的關鍵欄位,它可以由資料表現有的欄位中,挑選一組符合主鍵規則的當作主鍵,也能替表單增加一組專為識別用的欄位當主鍵。主鍵並不侷限只能有單一欄位,也能由多個欄位共同構成。
第二步驟,就是讓單一欄位內只能有一筆資料。所以我們將這些超過的資料改列一筆新資料,讓每個欄位都只儲存一筆資料,而其他的空白欄位,則需要填入符合該筆訂單的原始資料。

第三步,要確認表單內所有的欄位,都要與主鍵有關係,這點稱為相依性。完成之後,就變成經過1NF的水果訂單。

第二正規化消除重複欄位
接著,我們要開始執行2NF。在這個階段,除了要符合1NF之外,還要消除部分相依(Partial Dependency),以減少資料重複和不一致性。部分相依,所指的是,在多重主鍵的情況下,有些資料只跟部分主鍵有直接關係,而不是跟每個主鍵都有關聯。基本上,經過1NF且主鍵僅有單一欄位的資料表,就能符合2NF的規範。

從完成1NF的水果訂單上,貨品名稱及單價這兩欄位,只跟貨品編號有相依性,而不是跟整個主鍵有關聯,這樣就會有部分相依的問題,所以我們需要執行2NF來解決。

第三正規化將非主鍵決定的欄位獨立成新表單
接著要開始3NF,這個步驟除了要滿足前面兩個正規化,還要消除資料表中的遞移相依(Transitive Dependency)。

遞移相依的意思,是說資料表單中,有些欄位資料內容,在一張表單裡面,可以由某一個「不是主鍵」的欄位決定,像我們在完成2NF的表單中,客戶名稱這個欄位,其實是由客戶編號決定的,而不是訂單編號,因此需要執行第三正規化。

完成上述步驟後,水果訂單就能符合3NF的規範,而經過這些處理後,該表單也就完成了資料表的正規化。文⊙林郁翔

iThome歡迎讀者提問,請將你所遇到的各種企業IT疑難雜症,寄至iThome編輯部:QA@mail.ithome.com.tw

熱門新聞

Advertisement