問題
設計數據庫時外鍵到底應不應該使用?
回答
阿里的建議:
至於爲什麼是不用,貌似沒做具體說明,然後我就自己搜索了下,做出下面的總結。
解釋
以學生和成績的關係爲例,學生表中的student_id是主鍵,那麼成績表中的student_id則爲外鍵。如果更新學生表中的student_id,同時觸發成績表中的student_id更新,即爲級聯更新。外鍵與級聯更新適用於單機低併發,不適合分佈式、高併發集羣;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。
外鍵約束的優點、缺點
優點
- 保證表間保證數據的完整性和一致性,是事務的一致性實現
- 級聯操作方便
- 將數據完整性判斷託付 給了數據庫完成,減少了程序的代碼量
- DBA與開發分工明確,且減少代碼量
缺點
-
性能瓶頸
外鍵被數據庫維護,當涉及外鍵字段的增,刪,更新操作之後,需要觸發先關查詢去檢查,性能開銷 -
併發死鎖
update/delete時,外鍵對數據一致性的控制,其他表內部加鎖。進行行鎖操作,在併發大流量事務場景,很容易造成死鎖 -
擴展性差
隨着數據量的增加 ,分庫分表時,外鍵無法生效,所以將數據關係維護在程序中,方便遷移
總結
外鍵是否採用,看業務應用場景,以及開發成本的。
-
互聯網行業應用
不推薦使用外鍵, 用戶量大,併發高,數據庫容易成爲性能瓶頸,尤其受IO限制, 此時不用外鍵,把數據一致性的控制放到程序事務中,易於水平擴展。 -
傳統行業
軟件應用的用戶數有限,數據量也一般不會超大,且活躍數據有限。綜述,即數據庫服務器的性能不是問題,不用過多考慮性能問題。
說到底還是性能問題,如果說系統對性能要求高,則不用外鍵,否則,則可以使用(注意在程序中處理好數據的一致性)。