1. 程式人生 > 其它 >資料庫設計的三大正規化

資料庫設計的三大正規化

引言

關係資料庫中的關係必須滿足一定的要求。滿足不同程度要求的為不同正規化。資料庫的設計正規化是資料庫設計所需要滿足的規範。只有理解資料庫的設計正規化,才能設計出高效率、優雅的資料庫,否則可能會設計出糟糕的資料庫。

資料庫正規化的種類

資料庫的正規化主要有六種:(由低到高)
  • 第一正規化

  • 第二正規化

  • 第三正規化

  • BC正規化

  • 第四正規化

  • 第五正規化。

資料庫設計滿足最低要求的叫第一正規化,簡稱 1NF。在第一正規化基礎上進一步滿足一些要求的為第二正規化,簡稱 2NF。在第二正規化基礎上進一步滿足一些要求的為第三正規化,簡稱 3NF。其餘依此類推。

資料庫正規化的理解

資料庫設計是否滿足越高正規化就越好?

當然不是。滿足更高正規化雖然可以更好的避免資料冗餘,減少資料庫的佔用的儲存空間,減輕維護資料完整性的麻煩,但是會產生更多的小表,導致操作困難,因為需要關聯查詢多個小表才能得到所需要資料,而且正規化越高效能就會越差。

資料庫設計的三大正規化

在實際專案開發中,要權衡是否使用更高正規化是比較麻煩的事情,資料庫設計一般用得最多的也就是三大正規化,因為使用第一、第二和第三正規化也就足夠了,不僅效能好而且方便操作和管理資料。

第一正規化(1NF)

如果一個關係表中的每一個欄位都是原子項,也就是不可分割,那麼該表就滿足第一正規化

第一正規化是關係表應具備的最起碼的條件,如果資料庫設計不能滿足第一正規化,就不稱為關係型資料庫。

例如 (學生資訊表):

學生編號姓名性別聯絡方式
20080901 張三 email:[email protected],phone:13541220018
20080902 李四 email:[email protected],phone:1373081235

以上表就不符合第一正規化(1NF),原因是聯絡方式這個欄位可以再分。

正確如下:

學生編號姓名性別電子郵件電話
20080901 張三 [email protected] 13541220018
20080902 李四 [email protected] 13730812350

第二正規化(2NF)

如果一個關係表中每個非主鍵欄位都完全依賴於主鍵,而沒有部分依賴於主鍵,那麼該表就滿足第二正規化。

這裡完全依賴是啥意思,意思就是每個非主鍵欄位是由整個主鍵決定的,而不能由主鍵的一部分來決定。這裡所謂的主鍵一部分指的是複合主鍵,就是主鍵是由多個欄位組成的,共同定義一行資料的唯一性。比較常見的複合主鍵就是多對多關聯表時,中間表(也叫連線表)就是採用的複合主鍵。

例如(學生選課表):

學生課程教師教師職稱教材教室上課時間
張三 MyBatis 張老師 大資料講師 《MyBatis深入淺出》 207 09:30
李四 Hibernate 李老師 大資料講師 《Hibernate 深入淺出》 208 09:30

這裡通過(學生,課程)兩個欄位可以確定教師、教師職稱,教材,教室和上課時間,所以可以把(學生,課程)這兩個欄位作為複合主鍵。但是,教材並不完全依賴於(學生,課程),只拿出課程就可以確定教材,因為一個課程,一定指定了某個教材。

這就叫不完全依賴,或者部分依賴。出現這種情況,就不滿足第二正規化(2NF)。

正確如下:

  • 選課表:
學生課程教師教師職稱教室上課時間
張三 MyBatis 張老師 大資料講師 207 09:30
李四 Hibernate 李老師 大資料講師 208 09:30
  • 課程表:
課程教材
MyBatis 《MyBatis深入淺出》
Hibernate 《Hibernate深入淺出》

所以,第二正規化可以說是消除部分依賴。第二正規化可以減少插入異常,刪除異常和修改異常。

第三正規化(3NF)

如果一個關係表中,非主主鍵欄位之間不存在傳遞依賴,那麼這樣就滿足第三正規化。

選課表:

學生課程教師教師職稱教室上課時間
張三 MyBatis 張老師 大資料講師 207 09:30
李四 Hibernate 李老師 大資料講師 208 09:30

第二正規化修改後的選課表中,一個教師能確定一個教師職稱。這裡,雖然教師依賴於(學生,課程),但教師職稱僅依賴於教師,並不直接依賴於(學生,課程),這就叫傳遞依賴,第三正規化就是要消除傳遞依賴。

正確如下:

  • 選課表:
學生課程教師教室上課時間
張三 MyBatis 張老師 207 09:30
李四 Hibernate 李老師 208 09:30
  • 教師表:
教師教師職稱
張老師 大資料講師
李老師 大資料講師

這樣,新教師的職稱在沒被選課的時候也有地方存了,沒人選這個教師的課的時候教師的職稱也不至於被刪除,修改教師職稱時只修改教師表就可以了。

總結

資料庫設計並非遵循越高正規化越好,實際專案開發需要權衡,一般遵循三大正規化:

  • 第一正規化就是原子性(欄位不可再分割)

  • 第二正規化就是完全依賴(沒有部分依賴)

  • 第三正規化就是沒有傳遞依賴