mysql为何不建议使用外键
CSDN首頁
博客
課程
文庫·商城
問答
社區
插件
認證
開源
mysql為何不建議使用外鍵
搜索
會員中心
足跡
動態
消息
創作
mysql為何不建議使用外鍵_為什么很多mysql課程不推薦用物理外鍵?
大機靈聰明絕頂
于 2021-01-18 21:21:46 發布
1408
收藏
文章標簽: mysql為何不建議使用外鍵
版權
剛好今晚有師弟問我這個問題,就來搜搜。以前我對這個也是蠻困惑的。這一年來對這個問題感受比較深。
用外鍵的好處我就不多說了,既然是關系型數據庫,外鍵的約束為我們保證了數據主從關系和產生的先后關系,級聯操作為我們的update和delete帶來了不少方便。但成本是有的,你要權衡你是不是想付出這些代價。成本參考以下幾點:
1.外鍵的性能問題
我剛寫了一些,然后發現有人寫的更好而且簡潔,就引用吧:@mysqlops為何說外鍵有性能問題:
1.數據庫需要維護外鍵的內部管理;
2.外鍵等于把數據的一致性事務實現,全部交給數據庫服務器完成;
3.有了外鍵,當做一些涉及外鍵字段的增,刪,更新操作之后,需要觸發相關操作去檢查,而不得不消耗資源;
4.外鍵還會因為需要請求對其他表內部加鎖而容易出現死鎖情況;
作者:mysqlops
鏈接:https://www.zhihu.com/question/19600081/answer/13295957
來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總的來說物理外鍵是個比較“重”的實現,他會不顧性能不分輕重緩急的給你保證一致性。
2.mysql的外鍵設計問題
雖然很多人都不推薦你在關系型數據庫使用外鍵。 但你更多聽到的是mysql的,而不是SQLserver或者其他。比較公認的是,他的外鍵設計得的確不是很好,限制多功能不強大等,以innodb 為例子,包含但不限于以下幾點(我認為比較嚴重的)所有tables必須是InnoDB型,它們不能是臨時表。
在引用表中,必須有一個索引,外鍵列以同樣的順序被列在其中作為第一列。這樣一個索引如果不存在,它必須在引用表里被自動創建。
不支持對外鍵列的索引前綴。這樣的后果之一是BLOB和TEXT列不被包括在一個外鍵中,這是因為對這些列的索引必須總是包含一個前綴長度
InnoDB不對那些外鍵或包含NULL列的被引用鍵值檢查外鍵約束
印象中輪子哥 @vczh 在回答一個跟存儲過程有關的問題提到過,其他數據庫不建議使用存儲過程那是因為他們設計的不好,銀行內不都比較推薦甚至要求sqlserver使用存儲過程么(你沒騙我吧)。反正我以前也是用sqlserver的,我覺得是挺好的。
3.外鍵對拓展性的限制和影響
外鍵的主從關系是定的,然后你會遵守這個規矩去干活。但是計劃趕不上變化,萬一哪天主鍵所在表需要拆分了呢?需要重構了呢?萬一哪天你突然發現外鍵表不是非得跟主表的主鍵掛上關系呢?就我經歷過的來看,這種情況并不少見,尤其是數據庫設計者水平不夠高的情況下。
另一方面,數據庫幫你保證級聯關系,你平時寫程序的時候就真的思路清晰嗎?因為某些原因(比如你想要的關系數據庫不支持,mysql經常),有些地方你就不能設計外鍵了,當有級聯更新的需要時,一部分靠物理外鍵,一部分還得靠自己,我覺得還不如全靠代碼邏輯去保證。即使你對業務理解深刻,對外鍵也掌握的透徹,你也不太希望老是你管一部分他管一部分吧?
再放個大招,當你需要分庫分表的時候,外鍵就浮云了。
4.邏輯外鍵在業界比較成熟
外鍵是個好東西,不使用物理外鍵,我們也可以約定邏輯外鍵(不在數據庫聲明FK,在程序實現上表達關聯)
數據庫上的策略:可以選擇大多數情況下我們只更新不刪除,也就是邏輯刪,不再使用的歷史數據定期歸檔來減少壓力。
代碼的設計和限制:對表范圍的操作權限,開啟事務去處理邏輯,有需要進行異步操作來提高性能的我們設計補償機制去彌補,等等。
有人問原本在物理外鍵的開銷,在程序上不也有開銷嗎。但是這樣我們對優化性能的方式也靈活了,剛剛說的異步處理就是一種。視具體情況而定,如果設計的好,有時候某些“臟數據”你不是非得立刻刪除他,甚至不是非得刪除他。對于正確性>性能的說法,如果邏輯復雜到一定程度,物理外鍵一定能給你提供正確性嗎?這個可以討論討論。
最后,
來多點傳送門,因為老覺得想探討一個問題在一個帖子里能看到的太窄了。大家設計數據庫時使用外鍵嗎??www.zhihu.comzhihu-card-default.svg數據庫刪除記錄,是直接物理刪除好,還是偽刪除好??www.zhihu.comzhihu-card-default.svg在數據庫中具體創建表結構的時候,需要創建外鍵嗎??www.zhihu.comzhihu-card-default.svgSQL Server 和 Oracle 以及 MySQL 有哪些區別??www.zhihu.comzhihu-card-default.svg
其他的知乎上好像還有好幾個類似問題,不過沒什么人答,大家怎么老是問人家問過的啊。。。
最后是我把這個整理成了帖子
相關資源:MySQL刪除表的時候忽略外鍵約束的簡單實現_mysql如何取消外鍵約束…
大機靈聰明絕頂
關注
2
0
0
打賞
數據庫外鍵為什么被拋棄了?
軟件老王
182
1、背景 其實這個話題是老生常談,很多人在工作中確實也不會使用外鍵。包括在阿里的JAVA規范中也有下面這一條: 【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。 但是呢,詢問他們原因,大多是這么回答的: 每次做DELETE 或者UPDATE都必須考慮外鍵約束,會導致開發的時候很痛苦,測試數據極為不方便。 坦白說,這么說也是對的。但是呢,不夠全面,所以開一文來詳細說明。 2、正文 首先我們明確一點,外鍵約束是一種約束,這個約束的存在,會保證表間數據的關系“始終完整”。因此,外鍵約束的存在,并非全
參與評論
請發表有價值的評論, 博客評論不歡迎灌水,良好的社區氛圍需大家一起維護。
表情包
表情包
MySQL - 不使用外鍵約束的實操(二)_程序員牧碼的博客
3-21
MySQL - 不使用外鍵約束的實操(二) 互聯網開發中不用外鍵到底是個什么意思? 都說互聯網開發盡量不用外鍵,那么這里的不用外鍵到底代表的啥意思呢? 1. 這里有一層意思很明確: 不用外鍵約束。比如刪除一張表中的數據時,如果要級聯…
MySQL 不用外鍵的話,如何讓表起來關聯呢?_weixin_34006…
4-2
MySQL 不用外鍵的話,如何讓表起來關聯呢? 2019獨角獸企業重金招聘Python工程師標準>>> 最近在設計一個戶外APP的數據庫,在外鍵設計上有點糾結,用還是不用,考慮了再三,還是不用, 那么如何表之間的關聯了。只能在字段名上做文章了。
MySQL——不使用物理外鍵的原因
Lutra的博客
223
1、性能 使用物理外鍵會使得數據庫性能下降,并發能力下降 2、熱更新 分布式的項目,絕大多數都需要熱更新的,熱更新就是不停機去進行維護。不管是互聯網產品,還是一些游戲手游。大多都會采用熱更新的方式。如果數據庫有外鍵,可能會造成新更新的代碼 無法運行。 因為要匹配現有的外鍵,可能要重啟服務器。那么這樣就達不到熱更新的目的了。因為外鍵是強力執行的。注意點和分布式絕對是沖突的。 3、耦合度 去…
mysql為啥不能用外鍵_為什么在MySQL數據庫中無法創建外鍵
weixin_29016315的博客
186
展開全部一般情況下32313133353236313431303231363533e78988e69d8331333361326338,mysql是不贊成用外鍵的,因為這個完全可以用php等服務器腳本語言組織一些功能達到目的…如果 你一定要用,例子,簡單演示一下使用,做dage和xiaodi兩個表,大哥表是主鍵,小弟表是外鍵:建表1CREATETABLEdage(2id…
mysql為何不建議使用外鍵_MYSQL外鍵的使用以及優缺點…
3-13
2,用外鍵要適當,不能過分追求 3,不用外鍵而用程序控制數據一致性和完整性時,應該寫一層來保證,然后個個應用通過這個層來訪問數據庫。 需要注意的是:MySQL允許使用外鍵,但是為了完整性檢驗的目的,在除了InnoDB表類型之外的所有表類型中…
mysql是否需要設置外鍵_數據庫到底需不需要設置外鍵?_m…
3-11
(1)所有外鍵的約束,需要自己在邏輯層自己實現; (2)會出現數據錯誤覆寫,錯誤數據進庫的情況; (3)消耗了服務器的性能; (4)業務層里夾帶持久層特性,耦合; 總結: 1.互聯網行業:不推薦使用外鍵。
mysql sql外鍵的作用_為什么實際開發中不使用外鍵
weixin_39621178的博客
555
背景上學的時候,大家肯定都學習了數據庫相關的課程,MySQL和Oracle中都有外鍵。但是自從開始工作,我就發現一個奇怪的問題,企業實際開發中,表結構定義都不會用數據庫的外鍵,當需要用外鍵做關聯的時候,也是僅對字段進行冗余存儲,不會用foreign key的定義,究竟有哪些考量呢?此篇做個總結。外鍵什么是外鍵兩張表有關聯關系,才會涉及外鍵的概念。舉例 商品表(商品id、商品名稱),訂單表(訂單id…
mysql數據庫 外鍵設計的優缺點 - 個人見解
ailice001的博客
7551
mysql設置外鍵的好處阻止執行 從表插入新行,其外鍵值不是主表的主鍵值便阻止插入; 從表修改外鍵值,新值不是主表的主鍵值便阻止修改; 主表刪除行,其主鍵值在從表里存在便阻止刪除(要想刪除,必須先刪除從表的相關行); 主表修改主鍵值,舊值在從表里存在便阻止修改(要想修改,必須先刪除從表的相關行)。級聯執行 主表刪除行,連帶從表的相關行一起刪除; 主表修改主鍵值,…
MySQL中盡量少使用外鍵的原因_abigpineapple的博客
3-21
MySQL中盡量少使用外鍵的原因 mysql設置外鍵的好處 阻止執行 從表插入新行,其外鍵值不是主表的主鍵值便阻止插入; 從表修改外鍵值,新值不是主表的主鍵值便阻止修改; 主表刪除行,其主鍵值在從表里存在便阻止刪除(要想刪除,必須先…
mysql建表時外檢怎么創建_MySQL創建表時加入的約束以及外鍵約束的的意義
weixin_42452580的博客
140
1,創建表時加入的約束a)非空約束,not nullb)唯一約束,uniquec)主鍵約束,primary keyd)外鍵約束,foreign key1,非空約束,針對某個字段設置其值不為空,如:學生的姓名不能為空drop table if existst_student;create tablet_student(student_idint(10),student_namevarchar…
mysql是否推薦使用外鍵_MySQL 外鍵使用
weixin_30135925的博客
318
MySQL 外鍵使用外鍵的使用條件:1.兩個表必須是InnoDB表,MyISAM表暫時不支持外鍵(據說以后的版本有可能支持,但至少目前不支持);2.外鍵列必須建立了索引,MySQL 4.1.2以后的版本在建立外鍵時會自動創建索引,但如果在較早的版本則需要顯示建立;3.外鍵關系的兩個表的列必須是數據類型相似,也就是可以相互轉換類型的列,比如int和tinyint可以,而int和char則不可以;外鍵…
【數據庫外鍵】為什么不推薦使用物理外鍵?
corleone_4ever的博客
573
目錄 一、外鍵使用場景 二、為什么不使用物理外鍵 1.參考阿里手冊 2.物理外鍵的優點 3.物理外鍵的缺點 三、總結 一、外鍵使用場景 今天測試員測出來許多bug,是由于未解決外鍵關系照常的我問題. A表的id是B表的外鍵,業務上B表通過外鍵關聯A表獲取A表的name A表刪除后,B表無法獲取到name 通過加邏輯外鍵來解決了這個問題 二、為什么不使用物理外鍵 1.參考阿里手冊 2.物理外鍵的優點 保證數據的完整性和一致性 級聯操作方便 將數據完整性判斷托付給…
【原創】數據庫中為什么不推薦使用外鍵約束
weixin_30312659的博客
2131
引言 其實這個話題是老生常談,很多人在工作中確實也不會使用外鍵。包括在阿里的JAVA規范中也有下面這一條 【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。 但是呢,詢問他們原因,大多是這么回答的 每次做DELETE 或者UPDATE都必須考慮外鍵約束,會導致開發的時候很痛苦,測試數據極為不方便。 坦白說,這么說也是對的。但是呢,不夠全面,所以開一文來詳細說明。 正文 首先我們明…
MySQL - 不使用外鍵約束的實操(二)
牧碼的博客
807
互聯網開發中不用外鍵到底是個什么意思? 都說互聯網開發盡量不用外鍵,那么這里的不用外鍵到底代表的啥意思呢? 1. 這里有一層意思很明確: 不用外鍵約束。比如刪除一張表中的數據時,如果要級聯刪除另一張表中關聯的數據,以往是由數據庫來級聯約束的,現在應該將其移到程序中由程序來保持數據的一致性。 2. 另外一層意思: 外鍵的定義就是在一個表中的字段是另外一張表中的主鍵。如果僅按照"不使用外…
mysql 邏輯外鍵的設置
qq_16069927的博客
3638
本博客轉載自 https://www.jianshu.com/p/ab58fa7e8146 本博客字體標紅部分為設置外鍵的SQL語句 1.假如我們現在有個這樣的需求,我們公司有以下幾個部門,“研發部”,“產品部”,“運維部”,當有新員工進入的時候,需要只能加入以下三個部門的某個部門,沒有列表所示的部門將不能加入,這個時候,我們可以用到外鍵 我們來創建兩個表,create table …
MYSQL外鍵的使用以及優缺點
u010695055的專欄
9102
主鍵和索引是不可少的,不僅可以優化數據檢索速度,開發人員還省不其它的工作, 矛盾焦點:數據庫設計是否需要外鍵。這里有兩個問題:一個是如何保證數據庫數據的完整性和一致性;二是第一條對性能的影響。 正方觀點: 1,由數據庫自身保證數據一致性,完整性,更可靠,因為程序很難100%保證數據的完整性,而用外鍵即使在數據庫服務器當機或者出現其他問題的時候,也能夠最大限度的保證數據的一致性和完整性
mysql一對多究竟用還是不用外鍵_不使用外鍵,嘗試多對多查詢
weixin_31597759的博客
835
我的上兩篇博客總結了一下不使用外鍵的優缺點但是我還沒試過,今天嘗試了一下,用難一點的多對多關系實驗一:工具:springbootmybatismysql二:材料:五張表:user–用戶表role–角色表permission–權限表user-role表permission-role表其中,user-role表和permission-role表是意義上的中間表,就是沒有外鍵的,其他三張是基本表s…
mysql外鍵約束 弊端_記一個Mysql外鍵約束設計缺陷
weixin_35932973的博客
291
記一個Mysql外鍵約束設計缺陷背景信息最近在做項目的數據庫遷移,從Oracle到Mysql,一個外鍵約束在Oracle運行正常,在mysql報異常。(因為才接手沒幾天,對業務和框架不熟,在處理問題時花了很多時間。)[2018-08-01 13:34:19] [23000][1452] Cannot add or update a child row: a foreign key constrai…
mysql 外鍵性能_關于,在Mysql中,外鍵是否會影響性能的問題???
weixin_33729662的博客
670
In MySQL, a foreign key requires an index. If an index already exists, the foreign key will use that index (even using the prefix of an existing multi-column index). If no index exists, defining the f…
MySQL之為什么不建議使用外鍵約束
最新發布
u800820的專欄
132
接上篇短文中提到我們項目中不會設置外鍵,這里簡單談下原因。 外鍵的優點 外鍵能夠保證數據的一致性和完整性,通過設置外鍵,數據庫就會判斷數據的完整性,不需要在應用代碼里實現。 外鍵的缺點 性能問題 比如table_a和table_b通過外鍵關聯,當往table_a插入數據時,數據庫就會去查詢外鍵關聯的table_b里面有沒有對應數據,沒有對應數據是沒法入庫成功的。同時,在大數據量入庫的情況下,每次入庫都需要先查詢會導致性能瓶頸。 因此,阿里巴巴Java開發手冊里建議,不得使用外鍵與級聯,一切外鍵概念必須在應
MySQL數據庫為什么不推薦使用外鍵約束?
qq_44829938的博客
311
阿里巴巴的Java開發手冊中有這樣一句話: 不得使用外鍵與級聯,一切外鍵概念必須在應用層解決! 以student和grade的關系為例 ,student中的student_id是主鍵,成績表中的student_id則為外鍵 ! 先了解一下什么叫級聯更新和級聯刪除! 當在student表中要刪除或者更新student_id=20的相關信息,馬上在grade表中中查找是否有student_id=20這個記錄,然后進行刪除或更新,這就叫級聯。 外…
mysql 外鍵_為什么大多數互聯網公司不用外鍵約束
weixin_39645343的博客
139
是否使用外鍵約束【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決.-《阿里Java規范》首先外鍵(Foreign Key)是什么東西使用方案假設有一個score表 id是自增id,score是分數,student_id是學號。另一個student表,id是自增id,name是名字,student_id是學號。那么設計這個的時候就希望有一個關聯關系,讓score的student_id指向st…
“相關推薦”對你有幫助么?
非常沒幫助
沒幫助
一般
有幫助
非常有幫助
??2022 CSDN 皮膚主題:深藍海洋 設計師:CSDN官方博客 返回首頁
關于我們
招賢納士
商務合作
尋求報道
400-660-0108
kefu@csdn.net
在線客服
工作時間 8:30-22:00
公安備案號11010502030143
京ICP備19004658號
京網文〔2020〕1039-165號
經營性網站備案信息
北京互聯網違法和不良信息舉報中心
家長監護
網絡110報警服務
中國互聯網舉報中心
Chrome商店下載
?1999-2022北京創新樂知網絡技術有限公司
版權與免責聲明
版權申訴
出版物許可證
營業執照
大機靈聰明絕頂
碼齡3年
暫無認證
82
原創
周排名
90萬+
總排名
4萬+
訪問
等級
58
積分
5
粉絲
6
獲贊
0
評論
30
收藏
勤寫標兵Lv2
私信
關注
搜博主文章
熱門文章
arcgis里面怎么截圖_怎么利用ARCGIS裁剪圖像 4303
內存顆粒位寬和容量_最全的內存顆粒編碼規則說明,教你看穿內存條到底用的什么顆粒… 2391
msconfig藍屏_電腦msconfig改動后藍屏怎么修復 2309
onlyoffice開發java_OnlyOffice功能及演示 2173
普通話測試第四題評分標準_普通話機測培訓切中考生痛點(四)說話題評分標準及注意事項… 1925
您愿意向朋友推薦“博客詳情頁”嗎?
強烈不推薦
不推薦
一般般
推薦
強烈推薦
最新文章
jquery ajax safari,jquery - Safari browser ajax request error - Stack Overflow
讀取db服務器信息出錯,嘗試讀取foxpro dbf并獲取錯誤:無法初始化鏈接服務器的OLE DB提供程序“MSDASQL”的數據源對象“(空)”…
win7系統服務器上的要求嗎,win7和win10哪個對硬件要求高_網站服務器運行維護
2021年131篇2020年27篇
舉報
總結
以上是生活随笔為你收集整理的mysql为何不建议使用外键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 包装印刷行业裕同集团易普优APS项目顺利
- 下一篇: 《千与千寻》之解析