1. 程式人生 > >關係資料庫的四種正規化

關係資料庫的四種正規化

什麼是正規化
一張資料表的表結構所符合的某種設計標準的級別

主屬性
非主屬性

1 第1正規化 每個屬性必定不能再分
錯誤例子:
編號 品名 進貨(數量|單價) 銷售(數量|單價) 備註
修改後:
編號 品名 進貨數理 進貨單價 銷售數量 銷售單價 備註
 
2 第2正規化 2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函式依賴
錯誤例子:學號 姓名 系名 系主任  課名  分數
 
 資料冗餘過大
 新建系如何暫時沒有招生,就在資料庫建立不了資料進入資料庫內-新增異常
 學生畢業後刪除記錄,連繫主任都會被刪除-刪除異常
 某學生轉系,哪麼多條記錄中與系主任相關的記錄會被修改-修改異常

函式依賴:
 系名->系主任
 學號->系主任
(學號,課名)->分數
 不成立的函式依賴:
 學號->課名
 學號->分數
 課名->系主任
 (學號,課名)->姓名 //仔細想課名是決定不了姓名的,一點關係都沒有

函式依賴三種類型(完全函式依賴,部分函式依賴,傳遞函式依賴)
完全函式依賴
在一張表中,若X->Y,X中的任何一個真子集,都無法確定Y,但其全集可以確定,這個就記作XF->Y
eg:學號F-> 姓名
   (學號,課名)F->分數 學號或者課名都不能單獨確定分數

部分函式依賴
假如Y函式依賴於X,但同時Y並不完全函式依賴於X,記作X P->Y
eg:(學號,課名) P->姓名
也就是說碼存在兩個主屬性以上的時候,才可能會出現非主屬性對碼的部分函式依賴

傳遞函式依賴
如果Z函式依賴於Y,且Y函式依賴於X,X不依賴於Y,那麼就記作x T-Z
叫Z傳遞函式依賴於X。
也就是說碼和非主屬性存在2個以上的時候,才可能會出現非主屬性對碼的傳遞函式依賴


設K為某表中的一個屬性或屬性組,若除K之外的所有屬性都完全函式依賴於K,稱K為碼。

主屬性
包含在任何一個碼中的屬性成為主屬性
如:學號與課名組成的碼,它們兩分別為主屬性

判斷是否符合2NF步驟:
1 找出所有的碼
2 根據第1步的碼,找出所有的主屬性
3 在資料表中,除去所有的主屬性,剩下的就都是非主屬性
4 檢視是否存在非主屬性對碼的部分函式依賴

eg,使用上面2NF的錯誤表結構,
訣竅:如果A是碼,哪麼所有包含了A的屬性組都不會是碼了,因為作為碼的要求裡有一個“完全函式依賴”,把屬性全部列出來,連線

第一步: 碼是(學號,課程)
第二步:主屬性:學號與課名
第三步:非主屬性:姓名,系名,系主任,分數
第四步:(學號,課名)->姓名 ,學號->姓名, 所以(學號,課名)p->姓名
       (學號,課名)->系名,學號->系名,所以(學號,課名)p->系名
       (學號,課名)->系主任,學號->系主任,所以(學號,課名)p->系名
解決方案:將大資料表拆分成兩個或者更多個更小的資料表,

3 第3正規化 3NF在2NF的基礎之上,消除了非主屬性對於碼的傳遞函式依賴
在2NF的基礎上:產生三張新表
表1 選課 (學號 課名 分數)
表2 學生 (學號 姓名 系名)
表3 系 (系名,系主任)

BCNF正規化 解偶用的,重點觀察插入和刪除的時候,屬性對應的資料會出現哪些異常
eg:實體(倉庫名,管理員,物品名,數量)
主屬性:倉庫名,管理員,物品名
碼:(管理員,物品名),(倉庫名,物品名)
主屬性不能為空,刪除資料,倉庫名和管理員會被刪除,更改管理員,所以物品的記錄會被更新
,所以得出一個結論,即使滿足3NF,也可能存在插入,刪除,修改異常。
原因是什麼?存在主屬性對於碼的部分函式依賴與傳遞函式依賴,主屬性(倉庫名)對於碼(管理員,物品名)的部分函式依賴
解決辦法:在3NF的基礎上消除主屬性對於碼的部分與傳遞函式依賴