資料庫-三正規化優化與不推薦使用外來鍵

wangruijie發表於2021-04-17

什麼是三正規化

  • 第一正規化:“第一正規化的資料表必須是二維資料表”,第一正規化是指資料庫的每一列都是不可分割的基本資料項,強調列的原子性,某一屬性不能擁有幾個值。比如資料庫的電話號碼屬性裡面不可以有固定電話和行動電話值。 說明:在任何一個關聯式資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關聯式資料庫。

  • 第二正規化:建立在第一正規化的基礎上,即滿足第二正規化一定滿足第一正規化,第二正規化要求資料表每一個例項或者行必須被唯一標識。除滿足第一正規化外還有兩個條件,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。每一行的資料只能與其中一列相關,即一行資料只做一件事。只要資料列中出現資料重複,就要把表拆分開來。

  • 第三正規化:滿足第二正規化,且每一個非主屬性都不傳遞依賴於該正規化的候選鍵,則稱為第三正規化,即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。

三正規化優化

  • 主要是滿足第三正規化,即不產生資料冗餘、插入異常、刪除異常、依賴傳遞等。

拆分表,一張有依賴傳遞的表,如(blog、blog_class、blog_class_description),拆分成 blog(主表)、blog_class+blog_class_description(依賴關係表)、blog+blog_class(關聯關係表)

反三正規化優化

  • 反三正規化其實是基於三正規化所調整的,沒有冗餘的資料庫未必是最好的資料庫,完全按照第三正規化做表的設計可能會降低查詢效率(涉及多表查詢,多表連線JOIN,臨時表建立GROUP BY),有時候為了提高執行效率,就必須降低正規化的標準,適量保留冗餘資料。
  • 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放在物理資料模型時考慮。
  • 適當的合併一些表的欄位(減少表的數量),產生一些欄位冗餘,降低了查詢時的關聯,有時候可以提高查詢效率。
  • 因為在資料庫操作中,DQL的比例是要遠大於DML的
  • 反三正規化優化一定要適度,並且是在原本滿足但三正規化的基礎上做調整的。

為什麼不推薦使用外來鍵

外來鍵的優點

1、資料一致性

由資料庫自身保證資料一致性、完整性會更可靠。

2、ER圖可靠性、可讀性

有主外來鍵的資料庫可以增加資料庫可讀性

外來鍵的缺點

1、級聯

在阿里巴巴開發手冊中,就強制要求不允許使用外來鍵,所有的外來鍵概念必須在應用層解決,因為每次級聯DML操作時,都要級聯操作相關的外來鍵表,在高併發場景會導致效能瓶頸。

2、資料庫壓力增加

外來鍵等於將資料庫一致性實現,全部交給資料庫伺服器完成,有了外來鍵,當進行DML操作後,需要出發相關的操作去檢查,應用程式執行的判斷轉移到了資料庫上,增加資源消耗,資料庫效能開銷變大。

3、死鎖

每次修改都要去另外的表檢查資料,獲取額外的鎖。高併發大流量事務場景,使用外來鍵可能容易造成死鎖。

4、開發、維護不方便

有外來鍵在需要手工維護資料時,都需要考慮級聯問題,資料庫平臺遷移(如MySQL遷移到DB2)和分庫分表時,會省去很多麻煩

相關文章