讀阿里數據庫設計開發規範引發的思考

問題

設計數據庫時外鍵到底應不應該使用?

回答

阿里的建議:
在這裏插入圖片描述
至於爲什麼是不用,貌似沒做具體說明,然後我就自己搜索了下,做出下面的總結。

解釋

以學生和成績的關係爲例,學生表中的student_id是主鍵,那麼成績表中的student_id則爲外鍵。如果更新學生表中的student_id,同時觸發成績表中的student_id更新,即爲級聯更新。外鍵與級聯更新適用於單機低併發,不適合分佈式、高併發集羣;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。

外鍵約束的優點、缺點

優點

  • 保證表間保證數據的完整性和一致性,是事務的一致性實現
  • 級聯操作方便
  • 將數據完整性判斷託付 給了數據庫完成,減少了程序的代碼量
  • DBA與開發分工明確,且減少代碼量

缺點

  • 性能瓶頸
    外鍵被數據庫維護,當涉及外鍵字段的增,刪,更新操作之後,需要觸發先關查詢去檢查,性能開銷

  • 併發死鎖
    update/delete時,外鍵對數據一致性的控制,其他表內部加鎖。進行行鎖操作,在併發大流量事務場景,很容易造成死鎖

  • 擴展性差
    隨着數據量的增加 ,分庫分表時,外鍵無法生效,所以將數據關係維護在程序中,方便遷移

總結

外鍵是否採用,看業務應用場景,以及開發成本的。

  • 互聯網行業應用
    不推薦使用外鍵, 用戶量大,併發高,數據庫容易成爲性能瓶頸,尤其受IO限制, 此時不用外鍵,把數據一致性的控制放到程序事務中,易於水平擴展。

  • 傳統行業
    軟件應用的用戶數有限,數據量也一般不會超大,且活躍數據有限。綜述,即數據庫服務器的性能不是問題,不用過多考慮性能問題。

說到底還是性能問題,如果說系統對性能要求高,則不用外鍵,否則,則可以使用(注意在程序中處理好數據的一致性)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章