資料庫-三範式優化與不推薦使用外鍵

什麼是三範式

  • 第一範式:「第一範式的數據表必須是二維數據表」,第一範式是指資料庫的每一列都是不可分割的基本數據項,強調列的原子性,某一屬性不能擁有幾個值。比如資料庫的電話號碼屬性裡面不可以有固定電話和行動電話值。 說明:在任何一個關係資料庫中,第一範式(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)和分庫分表時,會省去很多麻煩

Tags: