第一範式要求確保表中每列的原子性,也就是不可拆分;
第二範式要求確保表中每列與主鍵相關,而不能只與主鍵的某部分相關(主要針對聯合主鍵),主鍵列與非主鍵列遵循完全函數依賴關係,也就是完全依賴;
第三範式確保主鍵列之間沒有傳遞函數依賴關係,也就是消除傳遞依賴。
第一範式(1NF)
定義:如果關係模式R的每個關係r的屬性都是不可分的數據項,那麼就稱R是第一範式的模式。
簡單的說,每一個屬性都是原子項,不可分割。
1NF是關係模式應具備的最起碼的條件,如果數據庫設計不能滿足第一範式,就不稱爲關係型數據庫。關係數據庫設計研究的關係規範化是在1NF之上進行的。
例如(學生信息表):
學生編號 姓名 性別 聯繫方式
20080901 張三 男 email:[email protected],phone:88886666
20080902 李四 女 email:[email protected],phone:66668888
以上的表就不符合,第一範式:聯繫方式字段可以再分,所以變更爲正確的是:
學生編號 姓名 性別 電子郵件 電話
20080901 張三 男 [email protected] 88886666
20080902 李四 女 [email protected] 66668888
第二範式(2NF)
定義:如果關係模式R是1NF,且每個非主屬性 完全函數依賴(往後看) 於候選鍵,那麼就稱R是第二範式。
簡單的說,第二範式要滿足以下的條件:首先要滿足第一範式,其次每個非主屬性要完全函數依賴與候選鍵,或者是主鍵。也就是說,每個非主屬性是由整個主鍵函數決定的,而不能由主鍵的一部分來決定。
例如(學生選課表):
學生 課程 教師 教師職稱 教材 教室 上課時間
李四 Spring 張老師 java講師 《Spring深入淺出》 301 08:00
張三 Struts 楊老師 java講師 《Struts in Action》 302 13:30
這裏通過(學生,課程)可以確定教師、教師職稱,教材,教室和上課時間,所以可以把(學生,課程)作爲主鍵。但是,教材並不完全依賴於(學生,課程),只拿出課程就可以確定教材,因爲一個課程,一定指定了某個教材。這就叫不完全依賴,或者部分依賴。出現這種情況,就不滿足第二範式。
修改後,選課表:
學生 課程 教師 教師職稱 教室 上課時間
李四 Spring 張老師 java講師 301 08:00
張三 Struts 楊老師 java講師 302 13:30
課程表:
課程 教材
Spring 《Spring深入淺出》
Struts 《Struts in Action》
所以,第二範式可以說是消除部分依賴。第二範式可以減少插入異常,刪除異常和修改異常。