详谈为什么互联网公司禁用外键约束
禁用外鍵約束是什么
不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。
為什么禁用外鍵約束
首先,假設(shè)我們用了數(shù)據(jù)庫(kù)約束外鍵,每次做 DELETE 或者 UPDATE 都必須考慮外鍵約束,會(huì)導(dǎo)致開(kāi)發(fā)的時(shí)候很痛苦,測(cè)試數(shù)據(jù)極為不方便。
如果測(cè)試或者開(kāi)發(fā)時(shí)我們需要?jiǎng)h除某個(gè)表的數(shù)據(jù),如果此時(shí)使用了外鍵約束與此表有十幾個(gè)關(guān)聯(lián),那豈不是要炸毛了。當(dāng)然這是使用層面帶來(lái)的麻煩。
當(dāng)然使用外鍵約束也有優(yōu)點(diǎn),保證數(shù)據(jù)的完整性和一致性、級(jí)聯(lián)操作方便、數(shù)據(jù)一致性交給數(shù)據(jù)庫(kù)、代碼量小。任何事情都會(huì)有利有弊。
接下來(lái)我們通過(guò)案例進(jìn)行講解
案例講解
這是一個(gè)很常見(jiàn)的訂單與訂單明細(xì)表,訂單表的主鍵與訂單明細(xì)表的訂單 Id 存在外鍵約束關(guān)系
數(shù)據(jù)庫(kù)層面外鍵約束維度
1 . 性能問(wèn)題
額外的數(shù)據(jù)一致性校驗(yàn)查詢(xún),當(dāng)在訂單明細(xì)表進(jìn)行數(shù)據(jù)插入操作時(shí),會(huì)檢查訂單表里是否存在對(duì)于的外鍵約束數(shù)據(jù)
2 . 并發(fā)問(wèn)題
外界約束會(huì)啟用行級(jí)鎖,主表寫(xiě)入時(shí)會(huì)進(jìn)入阻塞,什么意思呢?
當(dāng)用戶(hù)買(mǎi)了十幾樣商品,在對(duì)于的訂單明細(xì)表就會(huì)有十幾行數(shù)據(jù),再每次插入的時(shí)候,都會(huì)去檢查訂單表里是否存在訂單 ID ,這是正常的流程。
但是,如果在并發(fā)環(huán)境下,訂單明細(xì)表向訂單表檢查外鍵約束關(guān)系的時(shí)候,會(huì)在訂單表開(kāi)啟一個(gè)共享鎖(讀鎖)。
如果此時(shí)甭管什么原因,此時(shí)有個(gè)請(qǐng)求需要修改訂單表的訂單 ID ,此時(shí)訂單表就會(huì)開(kāi)啟一個(gè)排它鎖(寫(xiě)鎖)。那么此時(shí)訂單明細(xì)表就會(huì)進(jìn)入一個(gè)阻塞的狀態(tài),就行進(jìn)行一個(gè)線程的擠壓,進(jìn)而引發(fā)系統(tǒng)崩潰。
3 . 級(jí)聯(lián)刪除問(wèn)題
多層級(jí)聯(lián)刪除會(huì)讓數(shù)據(jù)變得不可控,觸發(fā)器也嚴(yán)格被禁用,什么意思呢?
如果此時(shí)我們想刪除訂單類(lèi)型,應(yīng)為訂單表與訂單類(lèi)型表存在外鍵約束關(guān)系,那么對(duì)于的訂單表里的此類(lèi)型的訂單都將會(huì)被刪除,訂單明細(xì)表的明細(xì)也將會(huì)刪除。如果存在更多的外鍵約束關(guān)系,則會(huì)刪除一連串的數(shù)據(jù),此時(shí)就會(huì)變得不可控。
這些操作都是在數(shù)據(jù)庫(kù)層面發(fā)生的,都是無(wú)法追溯的,是一件很麻煩的事。所以在實(shí)際開(kāi)發(fā)中數(shù)據(jù)庫(kù)層面的外鍵約束是嚴(yán)令禁止的。
4 . 數(shù)據(jù)耦合
數(shù)據(jù)庫(kù)層面數(shù)據(jù)關(guān)系產(chǎn)生耦合,數(shù)據(jù)遷移維護(hù)困難,什么意思呢?
如果某一天,訂單明細(xì)表的數(shù)據(jù)量過(guò)大,基于 MySQL 本身的性能應(yīng)用已經(jīng)不足以支持相對(duì)應(yīng)的業(yè)務(wù)需求。此時(shí)計(jì)劃將訂單明細(xì)數(shù)據(jù)遷移到 HBASE 這樣的大數(shù)據(jù)數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)。
那么此時(shí)是不是需要將原有的主外鍵約束關(guān)系給去掉,之后又如何保證數(shù)據(jù)的一致性問(wèn)題呢,此時(shí)只能通過(guò)程序?qū)用孢M(jìn)行約束,這是不是又回到了應(yīng)用層面。
在實(shí)際的項(xiàng)目經(jīng)驗(yàn)過(guò)程中,隨著業(yè)務(wù)發(fā)展,有些業(yè)務(wù)數(shù)據(jù)就會(huì)非常大,而應(yīng)為關(guān)系型數(shù)據(jù)庫(kù)本身的性能問(wèn)題,此時(shí)有些數(shù)據(jù)就會(huì)進(jìn)行一些遷移,這是非常常見(jiàn)的,而此時(shí)就需要在應(yīng)用層面確保數(shù)據(jù)的一致性,所以也就是有些公司為什么不推薦使用外鍵約束的原因。
總結(jié)
以上是生活随笔為你收集整理的详谈为什么互联网公司禁用外键约束的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自定义控件从入门到轻生之---来个结晶
- 下一篇: Class not found: “co