10-4 資料表的正規化
前一節介紹了如何將實體或關係轉換成資料表,但轉換後的資料表是否恰當,必須要有一套方法來評估它,這就是『正規化』(Normalization)。我們可以由兩個觀點來說明為何要正規化: 資料表為何需要正規化,有下列兩個原因: (A) 降低資料重複性 同一筆資料盡可能僅存放一個位置,雖然可以解決資料不一致性的問題,但有會造成許多額外的負擔。譬如,需要學生資料的地方有教務處、學務處、以及系所辦公室,如果三個地方都儲存,當我們需要修改、增加或刪除時,三個地方都要去執行,否則就會發生資料不一致性問題。但如果僅存放一個位置,其它地方必須能搜尋得到,則必須建立『關係』來聯繫,如果會增加了許多表格,查詢時也許要多利用合併或其它多重表格的方法,如此也會造成系統執行速度降慢。如何降低資料重複性問題,也是滿困難的事,因此,我們需利用正規化來評估它。 (B) 避免資料更新的異常 設計資料表的簡單構想,就是儘量將特定資料(如學生資料)儲存在某一個地方,以避免重複的問題,可能會將一個資料表分割成若干個資料表,之間再建立聯繫以維持原來的特性。但當某一個資料被更新時,其關係是否還是存在,否則就會造成資料更新的異常。 正規化之目的是要檢測資料表是否符合減少重複性與避免資料更新的異常,但這兩者常常相違背,如果資料要越安全,資料表可能需要分割越精細,這樣一來,會增加查詢資料的困難。如果我們用另外的角度來看,資料表設計也許有漏洞,但可以永遠不會去觸動它,此種漏洞也許可以容忍它存在,如此設計資料表就可以簡單許多。也就是說,正規化並不需要要求非常嚴謹,只要能符合環境需求就可以了。在下圖中顯示正規化的階層架構有 1NF、2NF、3NF、BCNF、4NF、以及PJ/NF等六個層次,越高層次所要求條件越高,資料表可能被分割得越細,一般系統應用只到 3NF 或 BCNF 就不錯了,我們也討論到這個層次就好。
圖 9-14 正規化的階層 在一個資料表裡有若干個欄位,或是說一個資料表示由若干個欄位所構成。如果學術一點用詞是『一個關聯是由數個屬性所描述』。接下來,就是如何選擇這些欄位,或欄位之間限制,這牽涉到欄位之間的功能相依姓。可區分為:
功能相依性關係到資料更新的異常,假設學生資料表為 {姓名、學號、地址、監護人、關係},其內容可能如下:
我們將此資料表內各欄位之間相依性關係劃出如圖 9-15 所示。姓名、地址與監護人欄位都直接相依於學號(主鍵),監護人電話相依於監護人、監護人再相依於學號。監護人電話與學號之間就是傳遞相依。
圖 9-15 傳遞功能性相依 |
翻轉工作室:粘添壽
資料庫系統概論(含邏輯設計)
翻轉電子書系列:
|