最近學習過程當中,產生了一個疑問,到底該不應使用外鍵?
不能本身瞎想,爲此,去了知乎,搜索相關話題,總結出下面內容。
一:使用外鍵
優勢:
(1)實現表與關聯表之間的數據一致性;
(2)能夠迅速的創建一個可靠性很是高的數據庫結構,而不用讓應用程序層去作過多的檢查;
(3)能夠提升系統魯棒性、健壯性;
(4)能夠實現開發人員和數據庫設計人員的分工;
缺點:
(1)數據庫須要維護外鍵的內部管理;
(2)外鍵等於把數據的一致性事務實現,所有交給數據庫服務器完成;
(3)有了外鍵,當作一些涉及外鍵字段的增,刪,更新操做以後,須要觸發相關操做去檢查,而不得不消耗資源;
(4)外鍵還會由於須要請求對其餘表內部加鎖而容易出現死鎖狀況;
(5)容易出現數據庫I/O的瓶頸;
二:不使用外鍵
優勢:
(1)減小了數據庫表與表之間各類關聯的複雜性;
(2)犧牲應用服務器資源,換取數據庫服務器的性能;
(3)將主動權把控在本身手裏;
(4)去掉外鍵至關於優化數據庫性能;
缺點:
(1)全部外鍵的約束,須要本身在邏輯層本身實現;
(2)會出現數據錯誤覆寫,錯誤數據進庫的狀況;
(3)消耗了服務器的性能;
(4)業務層裏夾帶持久層特性,耦合;
總結:
1. 互聯網行業:
不推薦使用外鍵。
理由:1)用戶量大,併發度高,爲此數據庫服務器很容易成爲性能瓶頸,尤爲受IO能力限制,且不能輕易地水平擴展;
2)如果把數據一致性的控制放到事務中,即讓應用服務器承擔此部分的壓力;
3)應用服務器通常都是能夠作到輕鬆地水平的伸縮;
2. 傳統行業:
可使用。
理由:1)軟件應用的人數有限,換句話說是可控的;
2 數據庫服務器的數據量也通常不會超大,且活躍數據有限;