2013年9月5日 星期四

資料表的正規化(Normalization)

Image[3]



正規化是為了使資料儲存與建立後,有一個統一的格式(便於設計)、利於日後使用(查詢、修改等用途)的資料表。以下藉由實作說明一個資料表如何正規劃:
訂單資料
  • 起初我們拿到客戶訂單,他的基本形式差不多是這樣:
Image(1)
第一階段正規化(First Normal Form)
  • 未正規化前,商品編號、商品名稱、商品數量欄位中有一筆以上的資料,使得我們沒辦法確定欄位要預留多少空間儲存資料。所以我們第一步是將這些欄位限制只能儲存一筆項目資料,將訂單中一個以上的項目分成數筆紀錄儲存:
    Image(2)
  • 而原本的六筆訂單資料,會成為16筆資料紀錄
  • 此時,我們去定義資料表的主要關鍵欄位,可能的方式是用訂單編號、客戶編號、商品編號三個欄位做為主要關鍵欄位,才能識別每筆資料的唯一性,找到正確的資料。
    Image(3)
  • 如上圖所示,要找到第四筆資料,我們需要T002+C003+A002

第二階段正規化
  • 我們發現資料表中有很多重複的部分,而且又具有相依性(例如客戶張曉風與客戶編號C001具有相同的意義),若表中部份欄位彼此相依,會使得管理不易,例如我們想要刪除客戶編號C001,可是卻發現,必須連客戶名稱欄位中的張曉風一併刪除,這種部份相依性,使得資料表中某欄位的修改或刪除可能影響到其他欄位。
  • 而像商品名稱這樣的欄位,他相依於商品編號,或者是客戶名稱相依於客戶編號,他們都只相依於主關鍵欄位的部分欄位,我們稱之部分相依
  • 我們希望,主要的資料表中的各個欄位要完全相依於主要關鍵,這樣才便於查詢、刪減。因此第二階段正規化就是要將部分相依的欄位獨立出來,成為另一個資料表
  • 可能的作法是將原資料表分割成訂單資料表與訂單交易明細資料表
    Image(4)Image(5)
  • 接著去除重複的部分
    Image(6)Image(7)
  • 而兩張資料表需要有相關性,因此我們新增一個訂單編號欄位在B2訂單交易資料表
    Image(8)
  • 此使我們便可以使用訂單編號欄位作為B3訂單資料表的主要關鍵欄位,而其餘的欄位都完全相依於主要關鍵
    Image(9)
  • 而B4訂單交易明細資料表仍然有部分相依的問題,我們把部分欄位獨立出來成為商品資料表:
    Image(10)Image(11)
  • 接著刪去重複的部分:
    Image(12)
    商品資料表中可以看出,只要確認商品編號,就可以確定該商品的基本資料,其主要關鍵便是商品編號。其餘欄位皆相依於主要關鍵。

第三階段正規化
  • 資料分割後,資料的關聯性與高效率已見雛型,不過還是存在一些問題:譬如訂單資料表中雖然訂單編號資料欄未是具有唯一性的主要關鍵,會影響其餘的資料欄位,但這些欄位中的客戶編號欄位又會影響客戶名稱欄位,造成了某些欄位除了依循著主要關鍵外,又依循了其他資料欄位的影響,造成了所謂的轉移性的相依(Transitive Dependency),第三階段正規化就是要解決這方面的問題。
  • 讓所有資料欄位除了相依主要關鍵欄位,不能再相依其他欄位的值來決定資料的正確性。同樣我們藉由獨立出另一個資料表的方式解決這個問題:
  • Image(13)Image(14)

總結而言
  • 第一階段:必須設定主要關鍵欄位,而欄位中只有一個單一資料值,並沒有重複的資料值
  • 第二階段:必須除去資料的部分相依性
  • 第三階段:必須除去資料的間接相依性

沒有留言:

張貼留言

此部落格主要作為學習研究、心得分享,歡迎大家討論指教...