數據庫設計的三大範式
什麽是範式:為了建立冗余較小、結構合理的數據庫,設計數據庫時必須遵循一定的規則。在關系型數據庫中這種規則就稱為範式。
目前關系數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、第四範式(4NF)、第五範式(5NF)和第六範式(6NF)
一般在項目中,前三種方式就滿足我們的需求了
第一範式:
簡單的說,數據表中的每一列(每個字段)必須是不可拆分的最小單元。每一個屬性都是原子項,不可分割。
第一範式是關系模式應具備的最起碼的條件,如果數據庫設計不能滿足第一範式,就不稱為關系型數據庫。關系數據庫設計研究的關系規範化是在1NF之上進行的。
例如(學生信息表):
20080901 張三 男 email:[email protected],phone:88886666
20080902 李四 女 email:[email protected],phone:66668888
以上的表就不符合,第一範式:聯系方式字段可以再分,所以變更為正確的是:
學生編號 姓名 性別 聯系方式 電話
20080901 張三 男 email:[email protected] 88886666
20080902 李四 女 email:[email protected] 66668888
第二範式(2NF)
例如(學生選課表):
學生 課程 教師 教師職稱 教材 教室 上課時間
李四 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》
所以,第二範式可以說是消除部分依賴。第二範式可以減少插入異常,刪除異常和修改異常。
第三範式(3NF)
第三範式要滿足以下的條件:首先要滿足第二範式。要求:表中的每一列只與主鍵直接相關而不是間接相關,
上例中修改後的選課表中,一個教師能確定一個教師職稱。這樣,教師依賴於(學生,課程),而教師職稱又依賴於教師,這叫傳遞依賴。第三範式就是要消除傳遞依賴。
修改後,選課表:
學生 課程 教師 教室 上課時間
李四 Spring 張老師 301 08:00
張三 Struts 楊老師 302 13:30
教師表:
教師 教師職稱
張老師 java講師
楊老師 java講師
這樣,新教師的職稱在沒被選課的時候也有地方存了,沒人選這個教師的課的時候教師的職稱也不至於被刪除,修改教師職稱時只修改教師表就可以了。
簡單的說,
第一範式就是原子性,字段不可再分割;
第二範式就是完全依賴,沒有部分依賴;
第三範式就是沒有傳遞依賴。
數據庫設計的三大範式