數據庫設計的第三範式java
關係數據庫中的關係必須知足必定的要求。知足不一樣程度要求的爲不一樣範式。數據庫的設計範式是數據庫設計所須要知足的規範。只有理解數據庫的設計範式,才能設計出高效率、優雅的數據庫,不然可能會設計出錯誤的數據庫.數據庫
目前,主要有六種範式:第一範式、第二範式、第三範式、BC範式、第四範式和第五範式。知足最低要求的叫第一範式,簡稱1NF。在第一範式基礎上進一步知足一些要求的爲第二範式,簡稱2NF。其他依此類推。數據庫設計
範式能夠避免數據冗餘,減小數據庫的空間,減輕維護數據完整性的麻煩,可是操做困難,由於須要聯繫多個表才能獲得所須要數據,並且範式越高性能就會 越差。要權衡是否使用更高範式是比較麻煩的,通常在項目中,用得最多的也就是第三範式,我認爲使用到第三範式也就足夠了,性能好並且方便管理數據。函數
函數依賴,若是一個表中某一個字段Y的值是由另一個字段或一組字段X的值來肯定的,就稱爲Y函數依賴於X。性能
第一範式(1NF)
定義:若是關係模式R的每一個關係r的屬性都是不可分的數據項,那麼就稱R是第一範式的模式。
簡單的說,每個屬性都是原子項,不可分割。
1NF是關係模式應具有的最起碼的條件,若是數據庫設計不能知足第一範式,就不稱爲關係型數據庫。關係數據庫設計研究的關係規範化是在1NF之上進行的。
例如(學生信息表):
學生編號 姓名 性別 聯繫方式
20080901 張三 男 email:zs@126.com,phone:88886666
20080902 李四 女 email:ls@126.com,phone:66668888
以上的表就不符合,第一範式:聯繫方式字段能夠再分,因此變動爲正確的是:
學生編號 姓名 性別 電子郵件 電話
20080901 張三 男 zs@126.com 88886666
20080902 李四 女 ls@126.com 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》
因此,第二範式能夠說是消除部分依賴。第二範式能夠減小插入異常,刪除異常和修改異常。
第三範式(3NF)
定義:若是關係模式R是2NF,且關係模式R(U,F)中的全部非主屬性對任何候選關鍵字都不存在傳遞依賴,則稱關係R是屬於第三範式。
簡單的說,第三範式要知足如下的條件:首先要知足第二範式,其次非主屬性之間不存在函數依賴。因爲知足了第二範式,表示每一個非主屬性都函數依賴於主鍵。若是非主屬性之間存在了函數依賴,就會存在傳遞依賴,這樣就不知足第三範式。
上例中修改後的選課表中,一個教師能肯定一個教師職稱。這樣,教師依賴於(學生,課程),而教師職稱又依賴於教師,這叫傳遞依賴。第三範式就是要消除傳遞依賴。
修改後,選課表:
學生 課程 教師 教室 上課時間
李四 Spring 張老師 301 08:00
張三 Struts 楊老師 302 13:30
教師表:
教師 教師職稱
張老師 java講師
楊老師 java講師
這樣,新教師的職稱在沒被選課的時候也有地方存了,沒人選這個教師的課的時候教師的職稱也不至於被刪除,修改教師職稱時只修改教師表就能夠了。
簡單的說,
第一範式就是原子性,字段不可再分割;
第二範式就是徹底依賴,沒有部分依賴;
第三範式就是沒有傳遞依賴。spa