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