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