第一範式(1NF)無重複的列(原子性)
第一範式(1NF)是指資料庫表的每一列都是不可分割的基本資料項目。所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項目,而不能是集合,數組,記錄等非原子資料項目。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。
說明:在任何一個關聯式資料庫中,第一範式(1NF)是對關係模式的基本要求,不滿足第一範式(1NF)的資料庫就不是關聯式資料庫。
例如,如下的資料庫表是符合第一範式的:
欄位1
欄位2
欄位3
欄位4
而這樣的資料庫表是不符合第一範式的:
欄位1
欄位2
欄位3
欄位4
欄位3.1
欄位3.2
第二範式(2NF)屬性完全依賴於主鍵
第二範式(2NF)就是非主屬性完全依賴於主關鍵字。
舉例子說明:
假定選課關係表為SelectCourse(學號, 姓名, 年齡, 課程名稱, 成績, 學分),關鍵字為組合關鍵字(學號, 課程名稱),因為存在如下決定關係:
(學號, 課程名稱) → (姓名, 年齡, 成績, 學分)
這個資料庫表不滿足第二範式,因為存在如下決定關係:
(課程名稱) → (學分)
(學號) → (姓名, 年齡)
即存在組合關鍵字中的欄位決定非關鍵字的情況。
由於不符合2NF,這個選課關係表會存在如下問題:
(1) 資料冗餘:
同一門課程由n個學生選修,"學分"就重複n-1次;同一個學生選修了m門課程,姓名和年齡就重複了m-1次。
(2) 更新異常:
若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。
(3) 插入異常:
假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。
(4) 刪除異常:
假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。
符合第二範式的庫表設計應該如下:把選課關係表SelectCourse改為如下三個表:
學生:Student(學號, 姓名, 年齡);
課程:Course(課程名稱, 學分);
選課關係:SelectCourse(學號, 課程名稱, 成績)。
第三範式(3NF)屬性不依賴於其它非主屬性
在1NF基礎上,任何非主屬性不依賴於其它非主屬性[在2NF基礎上消除傳遞依賴] 第三範式(3NF)是第二範式(2NF)的一個子集,即滿足第三範式(3NF)必須滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個關係中不包含已在其它關係已包含的非主關鍵字資訊。例如,存在一個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三範式(3NF)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三範式就是屬性不依賴於其它非主屬性,也就是在滿足2NF的基礎上,任何非主屬性不得傳遞依賴於主屬性。 由一下例子說明:
學生表Student(學號,姓名,年齡,性別,系別,系辦地址、系辦電話),關鍵字為單一關鍵字"學號",因為存在如下決定關係: (學號)→ (姓名,年齡,性別,系別,系辦地址、系辦電話 但是還存在下面的決定關係 (學號) → (所在系辦)→(系辦地點,系辦電話) 即存在非關鍵字段"系辦地點"、"系辦電話"對關鍵字段"學號"的傳遞函數依賴。 它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。 根據第三範式把學生關係表分為如下兩個表就可以滿足第三範式了: 學生:(學號,姓名,年齡,性別,系別); 系別:(系別,系辦地址、系辦電話)。 上面的資料庫表就是符合1NF,2NF,3NF範式的,消除了資料冗餘、更新異常、插入異常和刪除異常。