資料庫系統概論第 十章 資料庫邏輯設計   上一頁    下一頁

10-5 正規化步驟

 內容:

雖然我們並不需要達到第六階層的正規化,但最起碼還是需要到 3NF 的正規化,因此,我需要由 1NF2NF、到 3NF 之間按部就班達成。

10-5-1 1NF-第一正規化

第一正規化定義如下:『在一個資料表內,所屬欄位的內容都是單元值(Atomic Value),則稱該資料表滿足 1NF』簡單的說,每個欄位的內容都是最小單元,不可以再分割的。如需要再分割,則需另外再設計資料表的欄位。譬如:學生資料表內某一筆資料的地址是『高雄市鳥松區澄清路 840 號』,它就是一個單元值,不可以再區分其它欄位,譬如縣市、區域等等。

 

 

性別

40011223

張有明

高雄市鳥松區澄清路 840

07112234

40011224

劉志明

彰化市

 

 

真的需要將地址再區分縣市、區域的話,則資料表必須重新設計,將地址劃分為縣市、區域、道路,如下:(但它每個欄位也是單元值)

 

縣市

區域

  

性別

40011223

張有明

高雄市

鳥松區

澄清路 840

07112234

40011224

劉志明

彰化市

 

 

 

 

 

 

 

 

如果,如下面設計,姓名與地址同一個欄位存放,那它就不能滿足第一正規化。

 

監護人

關係

40011223

張有明(高雄市鳥松區澄清路 840 )

07112234

40011224

劉志明(彰化市 ….)

 

 

10-5-2 2NF-第二正規化

第二正規化定義如下:『一個資料表,除了符合第一正規化特性外,所有主鍵以外的欄位都必須與主鍵功能相依,則稱該資料表滿足 2NF』簡單的說,所有欄位都必須與主鍵之間功能性相依。假設學生選課資料表,記錄著學生選讀那些課程,每一位學生可修讀多門課,主鍵為 {學號、課程名稱},設計如下:

 

 

課程名稱

學分數

成績

必選修

40011223

張有明

高雄市###

資料庫管理系統

4

80

40011224

劉志明

彰化市###

資料庫管理系統

3

90

40011234

陳美麗

台南市###

計算機概論

2

85

49921234

林秀氣

屏東縣###

null

null

null

null

從上表可以看出它包含學生個人資料與成績,由資料表看得出來,我們必須選擇{學號、課程名稱}複合主鍵。是否主鍵以外的欄位都與主鍵功能相依,探討如下:

  • (a) 姓名與地址僅與學號相依,並不與課程名稱相依。

  • (b) 學分數、成績、必選修等欄位與課程名稱相依,並不與學號相依。

如此看起來它不符合第二正規化,可能出現問題如下:

  • 新增可能發生錯誤:如果僅增加一位學生『林秀氣』,當還未修讀任何課程,結果『課程名稱』欄位空白,違背主鍵不可 Null 之規定。

  • 更新可能發生錯誤:系上規定『資料庫管理系統』的學分數改為 4,如果僅更新『學號=40011223』的資料,其它同學的學分數就沒有變更到。

  • 刪除可能發生錯誤:如果刪除了學號=40011234 這筆資料,以後可能找不到『計算機概論』的資料了。

解決的方法很簡單,只要將表格拆成:學生資料表與選課總表等兩個表格即可,當然不僅這樣,往後還會慢慢談到相關技巧。

10-5-3 3NF-第三正規化

第三正規化定義如下:『一個資料表,除了符合第二正規化特性外,所有主鍵以外的欄位都僅能與主鍵功能相依,且沒有與其它欄位相依,則稱該資料表滿足 3NF』簡單的說,所有欄位都必須、且僅能與主鍵之間功能性相依,其它欄位之間不可以有相依的特性存在。假設我們設計學生資料表如下圖,欄位包含有:{學號、姓名、地址、郵遞區號、性別、電話},很容易可以看出必須選擇『學號』為主鍵,是否滿足 3NF 分析如下:

  • (a) 姓名、地址、郵遞區號、性別與電話都與學號之間功能性相依,符合 2NF 特性。

  • (b) 郵遞區號與地址之間功能相依,不符合 3NF 特性。

 

 

郵遞區號

性別

40011223

張有明

高雄市鳥松區澄清路 840

850

07112234

40011224

劉志明

彰化市

 

 

 

40011234

陳美麗

台南市安南區中華路 2

644

06234567

49921234

林秀氣

高雄市鳥松區澄清路 450

833

07231134

由此可以看出此學生資料表並不能符合 3NF 特性,期可能出現問題如下:

  • 更新可能出現錯誤:如果高雄市鳥松區的郵遞區號改為 850,如僅修改 40011223 這筆資料,則出現與 49921234 資料內郵遞區號不一致的現象。

  • 刪除可能出現錯誤:如刪除掉 40011234 這筆資料,可能無法再找到台南市安南區的郵遞區號資料了。

解決的方法是:

  • (a) 將郵遞區號另外再開啟一個資料表來存放,雖然可以滿足 3NF 規範,但也增加了一個資料表,是否需要這樣呢?這要看您系統的使用環境,並非一昧的追求最完善就是最好。

  • (b) 或者,如果郵遞區號不需要另外查詢,則將它加入地址欄位,也可以滿足 3NF

由上述正規化的操作可以發現,為了滿足更嚴謹的正規化,就是需要再細分資料表,如此可能再延伸查詢、更新與其它操作的困難。本人建議初學者正規化到這個階段就可以了,目前市面上 70% 以上資料庫系統,也幾乎只到規劃到這樣,如果熟悉資料庫運作之後,有興趣或需要再學習更進一步的正規化階段。

翻轉工作室:粘添壽

 

資料庫系統概論(含邏輯設計)

 

 

翻轉電子書系列: