資料庫設計的三大正規化
引言
關係資料庫中的關係必須滿足一定的要求。滿足不同程度要求的為不同正規化。資料庫的設計正規化是資料庫設計所需要滿足的規範。只有理解資料庫的設計正規化,才能設計出高效率、優雅的資料庫,否則可能會設計出糟糕的資料庫。
資料庫正規化的種類
資料庫的正規化主要有六種:(由低到高)
-
第一正規化
-
第二正規化
-
第三正規化
-
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 |
- 教師表:
教師 | 教師職稱 |
---|---|
張老師 | 大資料講師 |
李老師 | 大資料講師 |
這樣,新教師的職稱在沒被選課的時候也有地方存了,沒人選這個教師的課的時候教師的職稱也不至於被刪除,修改教師職稱時只修改教師表就可以了。
總結
資料庫設計並非遵循越高正規化越好,實際專案開發需要權衡,一般遵循三大正規化:
-
第一正規化就是原子性(欄位不可再分割)
-
第二正規化就是完全依賴(沒有部分依賴)
-
第三正規化就是沒有傳遞依賴