關聯式資料庫的正規化和反正規化設計

2021-09-29 19:20:26 字數 3045 閱讀 7583

## 關聯式資料庫的正規化和反正規化設計

正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。資料庫的設計正規化是資料庫設計所需要滿足的規範。只有理解資料庫的設計正規化,才能設計出高效率、優雅的資料庫,否則可能會設計出錯誤的資料庫。

目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,還又稱完美正規化)。滿足最低要求的叫第一正規化,簡稱1nf。在第一正規化基礎上進一步滿足一些要求的為第二正規化,簡稱2nf。其餘依此類推。各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。

通常所用到的只是前三個正規化,即:第一正規化(1nf),第二正規化(2nf),第三正規化(3nf)。

第一正規化(1nf):強調的是列的原子性,即列不能夠再分成其他幾列。簡而言之,*******=第一正規化就是無重複的列*****=**。

第二正規化(2nf):首先要滿足它是1nf,另外還需要包含兩部分內容:一是表必須有乙個主鍵;==二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。==

即要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性。

第三正規化(3nf):在1nf基礎上,任何非主屬性不依賴於其它非主屬性[在2nf基礎上消除傳遞依賴]。第三正規化(3nf)是第二正規化(2nf)的乙個子集,即滿足第三正規化(3nf)必須滿足第二正規化(2nf)。

簡而言之,第三正規化(3nf)要求乙個關係中不包含已在其它關係已包含的非主關鍵字資訊。例如,存在乙個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3nf)也應該構建它,否則就會有大量的資料冗餘。==簡而言之,第三正規化就是屬性不依賴於其它非主屬性,也就是在滿足2nf的基礎上,任何非主屬性不得傳遞依賴於主屬性。==

關於正規化的討論

第二正規化和第三正規化如何區別?

第二正規化:非主鍵列是否依賴主鍵(包括一列通過某一列間接依賴主鍵),要是有依賴關係的就是第二正規化;

第三正規化:非主鍵列是否是直接依賴主鍵,不能是那種通過傳遞關係的依賴的。要是符合這種就是第三正規化;

**使用正規化有哪些優點和缺點?** 

==正規化可以避免資料冗餘,減少資料庫的空間,減輕維護資料完整性的麻煩。==

正規化再給我們帶來的上面的好處時,同時也伴隨著一些不好的地方:==按照正規化的規範設計出來的表,等級越高的正規化設計出來的表越多。==

如第一正規化可能設計出來的表可能只有一張表而已,再按照第二正規化去設計這張表時就可能出來兩張或更多張表,如果再按第三正規化或更高的正規化去設計這張表會出現更多比第二正規化多的表。

表的數量越多,當我們去查詢一些資料,必然要去多表中去查詢資料,這樣查詢的時間要比在一張表中查詢中所用的時間要高很多。也就是說我們所用的正規化越高,對資料操作的效能越低。

所以我們在利用正規化設計表的時候,要根據具體的需求再去權衡是否使用更高正規化去設計表。在一般的專案中,我們用的最多也就是第三正規化,第三正規化也就可以滿足我們的專案需求,效能好而且方便管理資料;

當我們的業務所涉及的表非常多,經常會有多表發生關係,並且我們對錶的操作要時間上要盡量的快,這時可以考慮我們使用「反正規化」。

**關於反正規化**

不滿足正規化的模型,就是反正規化模型。

反正規化跟正規化所要求的正好相反,在反正規化的設計模式,我們可以允許適當的資料的冗餘,用這個冗餘去取運算元據時間的縮短。本質上就是用空間來換取時間,把資料冗餘在多個表中,當查詢時可以減少或者是避免表之間的關聯;

rdbms模型設計過程中,常常使用正規化約束我們的模型,但在nosql模型中則大量採用反正規化。

正規化和反正規化的對比

模型 |優點 | 缺點

---|---|---

反正規化化模型 | 資料冗餘將帶來很好的讀取效能(因為不需要join很多表,而且通常反正規化模型很少做更新操作)|需要維護冗餘資料,從目前nosql的發展可以看到,對磁碟空間的消耗是可以接受的

正規化化模型 | 資料沒有冗餘,更新容易| 當表的數量比較多,查詢設計需要很多關聯模型(join)時,會導致查詢效能低下

## 舉個栗子

---書上講了好多, 歸結起來3句話: 

1nf:字段不可分; 

2nf:有主鍵,非主鍵字段依賴主鍵; 

3nf:非主鍵字段不能相互依賴; 

解釋: 

1nf:原子性 字段不可再分,否則就不是關聯式資料庫; 

2nf:唯一性 乙個表只說明乙個事物; 

3nf:每列都與主鍵有直接關係,不存在傳遞依賴; 

不符合第一正規化的例子(關聯式資料庫中create不出這樣的表): 

表:欄位1, 欄位2(欄位2.1, 欄位2.2), 欄位3 ...... 

存在的問題: 因為設計不出這樣的表, 所以沒有問題; 

不符合第二正規化的例子: 

表:學號, 姓名, 年齡, 課程名稱, 成績, 學分; 

這個表明顯說明了兩個事務:學生資訊, 課程資訊; 

存在問題: 

資料冗餘,每條記錄都含有相同資訊; 

刪除異常:刪除所有學生成績,就把課程資訊全刪除了; 

插入異常:學生未選課,無法記錄進資料庫; 

更新異常:調整課程學分,所有行都調整。 

修正: 

學生:student(學號, 姓名, 年齡); 

課程:course(課程名稱, 學分); 

選課關係:selectcourse(學號, 課程名稱, 成績)。 

滿足第2正規化只消除了插入異常。 

不符合第三正規化的例子: 

學號, 姓名, 年齡, 所在學院, 學院聯絡**,關鍵字為單一關鍵字"學號"; 

存在依賴傳遞: (學號) → (所在學院) → (學院地點, 學院**) 

存在問題: 

資料冗餘:有重複值; 

更新異常:有重複的冗餘資訊,修改時需要同時修改多條記錄,否則會出現資料不一致的情況 

刪除異常 

修正: 

學生:(學號, 姓名, 年齡, 所在學院); 

學院:(學院, 地點, **)。 

參考文獻

[資料庫 三正規化最簡單最易記的解釋](

---

關聯式資料庫的正規化和反正規化設計

正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。資料庫的設計正規化是資料庫設計所需要滿足的規範。只有理解資料庫的設計正規化,才能設計出高效率 優雅的資料庫,否則可能會設計出錯誤的資料庫。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三...

關聯式資料庫的正規化和反正規化設計

正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。資料庫的設計正規化是資料庫設計所需要滿足的規範。只有理解資料庫的設計正規化,才能設計出高效率 優雅的資料庫,否則可能會設計出錯誤的資料庫。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三...

關聯式資料庫設計正規化

簡介 設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴德斯科正規化 bcnf 第四正規化 4nf 和第...