阿里云:不得在數(shù)據(jù)庫(kù)中使用外鍵
2024-06-06 加入收藏
大家好,我是在數(shù)據(jù)庫(kù)設(shè)計(jì)中踩過(guò)雷的小K,今天來(lái)聊聊數(shù)據(jù)庫(kù)中的強(qiáng)約束和弱約束的問(wèn)題。
在以前學(xué)習(xí)數(shù)據(jù)相關(guān)知識(shí)的時(shí)候,有幸閱讀過(guò)阿里的數(shù)據(jù)庫(kù)開(kāi)發(fā)規(guī)范手冊(cè),里面提到一條強(qiáng)制等級(jí)的規(guī)范:不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。
當(dāng)時(shí)我就很困惑,外鍵約束挺方便的,為什么大廠的規(guī)范中直接被強(qiáng)制禁用了?
雖然手冊(cè)后面講了原因,但當(dāng)時(shí)身為小白的我還是一知半解的,直到在工作崗位上被“上了一課”。
數(shù)據(jù)庫(kù)有無(wú)外鍵約束的區(qū)別
有外鍵
每次向數(shù)據(jù)庫(kù)添加數(shù)據(jù)都需要去檢查外鍵約束,檢查關(guān)聯(lián)表是否已經(jīng)存在數(shù)據(jù),硬性保持?jǐn)?shù)據(jù)一致性,如果一條記錄中存在多個(gè)外鍵,這樣的buff還將會(huì)被疊加(性能損耗加成)。
無(wú)外鍵
不檢查外鍵的合法性,直接插入。
外鍵在大型項(xiàng)目中帶來(lái)的麻煩
數(shù)據(jù)庫(kù)更新風(fēng)暴: 在數(shù)據(jù)庫(kù)系統(tǒng)中大規(guī)模的、瞬時(shí)性的更新操作,通常會(huì)導(dǎo)致數(shù)據(jù)庫(kù)性能下降或者服務(wù)不穩(wěn)定。這種情況通常發(fā)生在有大量并發(fā)用戶或者應(yīng)用程序同時(shí)對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫操作時(shí),特別是在沒(méi)有有效控制并發(fā)訪問(wèn)的情況下。
在發(fā)生數(shù)據(jù)庫(kù)更新風(fēng)暴時(shí)會(huì)導(dǎo)致的問(wèn)題:
性能下降:大規(guī)模的寫操作會(huì)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)負(fù)載增加,可能導(dǎo)致查詢響應(yīng)時(shí)間延長(zhǎng)或者系統(tǒng)整體性能下降。 鎖競(jìng)爭(zhēng):多個(gè)并發(fā)寫操作可能導(dǎo)致鎖競(jìng)爭(zhēng),進(jìn)而影響系統(tǒng)的并發(fā)性能和吞吐量。 死鎖:如果更新操作涉及多個(gè)數(shù)據(jù)表或者多個(gè)數(shù)據(jù)行,并且沒(méi)有正確處理事務(wù)和鎖定,可能會(huì)導(dǎo)致死鎖,進(jìn)而影響系統(tǒng)穩(wěn)定性。 數(shù)據(jù)一致性問(wèn)題:大規(guī)模更新操作可能會(huì)導(dǎo)致數(shù)據(jù)一致性問(wèn)題,例如數(shù)據(jù)丟失、數(shù)據(jù)錯(cuò)誤或者數(shù)據(jù)不一致的情況發(fā)生。(數(shù)據(jù)缺失比數(shù)據(jù)錯(cuò)誤要更嚴(yán)重。)
外鍵難以跨越數(shù)據(jù)庫(kù)使用:在大型項(xiàng)目中,當(dāng)數(shù)據(jù)量特別大的時(shí)候,一般會(huì)采取分庫(kù)分表來(lái)存儲(chǔ)數(shù)據(jù)。
但在不同的庫(kù)中使用相同的外鍵來(lái)維護(hù)數(shù)據(jù)一致性和完整性是非常難的操作。所以在分布式、高并發(fā)集群的項(xiàng)目數(shù)據(jù)庫(kù)中一般看不到外鍵的存在。
最后
外鍵是否采用,具體還要看業(yè)務(wù)應(yīng)用場(chǎng)景,以及開(kāi)發(fā)成本的。
中大型項(xiàng)目:
不推薦使用外鍵, 用戶量大,并發(fā)高,數(shù)據(jù)庫(kù)容易成為性能瓶頸,尤其受IO限制,此時(shí)不用外鍵,把數(shù)據(jù)一致性的控制放到程序事務(wù)中,易于水平擴(kuò)展。
小型項(xiàng)目:
軟件應(yīng)用的用戶數(shù)有限,數(shù)據(jù)量也一般不會(huì)超大,且活躍數(shù)據(jù)有限。即數(shù)據(jù)庫(kù)服務(wù)器的性能不是問(wèn)題,不用過(guò)多考慮性能問(wèn)題。