1NF 2NF 3NF BCNF
http://jacki6.iteye.com/blog/774866
資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入( insert )、刪除( delete )和更新( update )操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。
正規化說明
1.1 第一正規化( 1NF )無重複的列
所謂第一正規化(
1NF
)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(
說明:在任何一個關係資料庫中,第一正規化( 1NF )是對關係模式的基本要求,不滿足第一正規化( 1NF )的資料庫就不是關係資料庫。
例如,如下的資料庫表是符合第一正規化的:
欄位 1 |
欄位 2 |
欄位 3 |
欄位 4 |
而這樣的資料庫表是不符合第一正規化的:
欄位 1 |
欄位 2 |
欄位 3 |
欄位 4 |
|
欄位 3.1 |
欄位 3.2 |
資料庫表中的欄位都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。很顯然,在當前的任何關係資料庫管理系統(
1.2 第二正規化( 2NF )屬性完全依賴於主鍵 [ 消除部分子函式依賴 ]
如果關係模式 R 為第一正規化,並且 R 中每一個非主屬性完全函式依賴於 R 的某個候選鍵, 則稱為第二正規化模式。
第二正規化(
2NF
)是在第一正規化(
1NF
)的基礎上建立起來的,即滿足第二正規化(
2NF
)必須先滿足第一正規化(
1NF
)。第二正規化(
例如員工資訊表中加上了員工編號( emp_id )列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分。
簡而言之,第二正規化( 2NF )就是非主屬性完全依賴於主關鍵字。
所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性(設有函式依賴 W→A ,若存在 XW ,有 X→A 成立,那麼稱 W→A 是區域性依賴,否則就稱 W→A 是完全函式依賴)。如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。
假定選課關係表為 SelectCourse( 學號 , 姓名 , 年齡 , 課程名稱 , 成績 , 學分 ) ,關鍵字為組合關鍵字 ( 學號 , 課程名稱 ) ,因為存在如下決定關係:
( 學號 , 課程名稱 ) → ( 姓名 , 年齡 , 成績 , 學分 )
這個資料庫表不滿足第二正規化,因為存在如下決定關係:
( 課程名稱 ) → ( 學分 )
( 學號 ) → ( 姓名 , 年齡 )
即存在組合關鍵字中的欄位決定非關鍵字的情況。
由於不符合 2NF ,這個選課關係表會存在如下問題:
(1) 資料冗餘:
同一門課程由 n 個學生選修, " 學分 " 就重複 n-1 次;同一個學生選修了 m 門課程,姓名和年齡就重複了 m-1 次。
(2) 更新異常:
若調整了某門課程的學分,資料表中所有行的 " 學分 " 值都要更新,否則會出現同一門課程學分不同的情況。
(3) 插入異常:
假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有 " 學號 " 關鍵字,課程名稱和學分也無法記錄入資料庫。
(4) 刪除異常:
假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。
把選課關係表 SelectCourse 改為如下三個表:
學生: Student( 學號 , 姓名 , 年齡 ) ;
課程: Course( 課程名稱 , 學分 ) ;
選課關係: SelectCourse( 學號 , 課程名稱 , 成績 ) 。
這樣的資料庫表是符合第二正規化的, 消除了資料冗餘、更新異常、插入異常和刪除異常。
另外,所有單關鍵字的資料庫表都符合第二正規化,因為不可能存在組合關鍵字。
1.3 第三正規化( 3NF )屬性不依賴於其它非主屬性 [ 消除傳遞依賴 ]
如果關係模式 R 是第二正規化,且每個非主屬性都不傳遞依賴於 R 的候選鍵,則稱 R 為第三正規化模式。
滿足第三正規化( 3NF )必須先滿足第二正規化( 2NF )。第三正規化( 3NF )要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。
例如,存在一個部門資訊表,其中每個部門有部門編號( dept_id )、部門名稱、部門簡介等資訊。那麼在的員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化( 3NF )也應該構建它,否則就會有大量的資料冗餘。
第三正規化( 3NF ):在第二正規化的基礎上,資料表中如果不存在非關鍵欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。
所謂傳遞函式依賴,指的是如果存在 "A → B → C" 的決定關係,則 C 傳遞函式依賴於 A 。
因此,滿足第三正規化的資料庫表應該不存在如下依賴關係:
關鍵欄位 → 非關鍵欄位 x → 非關鍵欄位 y
假定學生關係表為 Student( 學號 , 姓名 , 年齡 , 所在學院 , 學院地點 , 學院電話 ) ,關鍵字為單一關鍵字 " 學號 " ,因為存在如下決定關係:
( 學號 ) → ( 姓名 , 年齡 , 所在學院 , 學院地點 , 學院電話 )
這個資料庫是符合 2NF 的,但是不符合 3NF ,因為存在如下決定關係:
( 學號 ) → ( 所在學院 ) → ( 學院地點 , 學院電話 )
即存在非關鍵欄位 " 學院地點 " 、 " 學院電話 " 對關鍵欄位 " 學號 " 的傳遞函式依賴。
它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。
把學生關係表分為如下兩個表:
學生: ( 學號 , 姓名 , 年齡 , 所在學院 ) ;
學院: ( 學院 , 地點 , 電話 ) 。
這樣的資料庫表是符合第三正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。
1.4 鮑依斯 - 科得正規化( BCNF 是 3NF 的改進形式)
若關係模式 R 是第一正規化,且每個屬性都不傳遞依賴於 R 的候選鍵。這種關係模式就是 BCNF 模式。即在第三正規化的基礎上,資料庫表中如果不存在任何欄位對任一候選關鍵欄位的傳遞函式依賴則符合鮑依斯 - 科得正規化。
假設倉庫管理關係表為 StorehouseManage( 倉庫 ID, 儲存物品 ID, 管理員 ID, 數量 ) ,且有一個管理員只在一個倉庫工作;一個倉庫可以儲存多種物品。這個資料庫表中存在如下決定關係:
( 倉庫 ID, 儲存物品 ID) → ( 管理員 ID, 數量 )
( 管理員 ID, 儲存物品 ID) → ( 倉庫 ID, 數量 )
所以, ( 倉庫 ID, 儲存物品 ID) 和 ( 管理員 ID, 儲存物品 ID) 都是 StorehouseManage 的候選關鍵字,表中的唯一非關鍵欄位為數量,它是符合第三正規化的。但是,由於存在如下決定關係:
( 倉庫 ID) → ( 管理員 ID)
( 管理員 ID) → ( 倉庫 ID)
即存在關鍵欄位決定關鍵欄位的情況,所以其不符合 BCNF 正規化。它會出現如下異常情況:
(1) 刪除異常:
當倉庫被清空後,所有 " 儲存物品 ID" 和 " 數量 " 資訊被刪除的同時, " 倉庫 ID" 和 " 管理員 ID" 資訊也被刪除了。
(2) 插入異常:
當倉庫沒有儲存任何物品時,無法給倉庫分配管理員。
(3) 更新異常:
如果倉庫換了管理員,則表中所有行的管理員 ID 都要修改。
把倉庫管理關係表分解為二個關係表:
倉庫管理: StorehouseManage( 倉庫 ID, 管理員 ID) ;
倉庫: Storehouse( 倉庫 ID, 儲存物品 ID, 數量 ) 。
這樣的資料庫表是符合 BCNF 正規化的,消除了刪除異常、插入異常和更新異常。
四種正規化之間存在如下關係: