日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

數據庫中為什么不推薦使用外鍵約束

 

首先我們明確一點,外鍵約束是一種約束,這個約束的存在,會保證表間數據的關系“始終完整”。因此,外鍵約束的存在,并非全然沒有優點。

1. 引言

其實這個話題是老生常談,很多人在工作中確實也不會使用外鍵。包括在阿里的JAVA規范中也有下面這一條

【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。

但是呢,詢問他們原因,大多是這么回答的

每次做DELETE 或者UPDATE都必須考慮外鍵約束,會導致開發的時候很痛苦,測試數據極為不方便。

坦白說,這么說也是對的。但是呢,不夠全面,所以開一文來詳細說明。

2. 正文

首先我們明確一點,外鍵約束是一種約束,這個約束的存在,會保證表間數據的關系“始終完整”。因此,外鍵約束的存在,并非全然沒有優點。

比如使用外鍵,可以

  • 保證數據的完整性和一致性
  • 級聯操作方便
  • 將數據完整性判斷托付給了數據庫完成,減少了程序的代碼量
    然而,魚和熊掌不可兼得。外鍵是能夠保證數據的完整性,但是會給系統帶來很多缺陷。正是因為這些缺陷,才導致我們不推薦使用外鍵,具體如下:

3. 性能問題

假設一張表名為user_tb。那么這張表里有兩個外鍵字段,指向兩張表。那么,每次往user_tb表里插入數據,就必須往兩個外鍵對應的表里查詢是否有對應數據。如果交由程序控制,這種查詢過程就可以控制在我們手里,可以省略一些不必要的查詢過程。但是如果由數據庫控制,則是必須要去這兩張表里判斷。

4. 并發問題

在使用外鍵的情況下,每次修改數據都需要去另外一個表檢查數據,需要獲取額外的鎖。若是在高并發大流量事務場景,使用外鍵更容易造成死鎖。

5. 擴展性問題

這里主要是分為兩點

  • 做平臺遷移方便,比如你從MySQL遷移到Oracle,像觸發器、外鍵這種東西,都可以利用框架本身的特性來實現,而不用依賴于數據庫本身的特性,做遷移更加方便。
  • 分庫分表方便,在水平拆分和分庫的情況下,外鍵是無法生效的。將數據間關系的維護,放入應用程序中,為將來的分庫分表省去很多的麻煩。
    技術問題

使用外鍵,其實將應用程序應該執行的判斷邏輯轉移到了數據庫上。那么這意味著一點,數據庫的性能開銷變大了,那么這就對DBA的要求就更高了。很多中小型公司由于資金問題,并沒有聘用專業的DBA,因此他們會選擇不用外鍵,降低數據庫的消耗。

相反的,如果該約束邏輯在應用程序中,發現應用服務器性能不夠,可以加機器,做水平擴展。如果是在數據庫服務器上,數據庫服務器會成為性能瓶頸,做水平擴展比較困難。

分享到:
標簽:數據庫
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定