• 一句话总结就是:使用外键可以保证数据安全、一致,降低开发难度;但是在对于高并发、分布式的场景的场景,使用外键意味着每次的sql都会产生额外的外键检查,加大了数据库的负担,降低了速度。

  • 实际开发中的做法: 开发环境 / 测试环境:加上外键,便于发现数据问题。

    生产环境

    • 核心业务表(用户、订单、商品等强关联表)保留外键。

    • 高并发、大数据量表去掉外键,在应用层或通过消息队列 + 定时任务保证一致性。

    替代方案

    • 应用层校验 + 事务

    • 数据库触发器(Trigger)(部分复杂场景可补充或替代外键的约束,但同样存在性能和维护成本)

    • 异步任务 + 最终一致性(最常用高并发方案)

    • 使用**软删除(soft delete)**避免真实删除带来的级联问题(增加一个字段来判断其是或否被删除