阿里规范中禁用外键的原因
大约 8 分钟
阿里规范中禁用外键的原因
在阿里开发规范中,为什么要禁用外键约束。为什么有的公司大力推广外键约束,而有的公司对外键约束嗤之以鼻?
阿里数据库开发规范
阿里巴巴定期更新内部的Java开发规范,其中在数据库篇中明确规定:
不得使用外键与级联,一切外键概念必须在应用层来解决。
这份文档虽然对外键的解释不太全面,但明确指出了在实际项目开发中不推荐使用外键。
为什么不喜欢使用外键
数据完整性带来的不便
- 测试和开发不便:增加、删除或更新外键约束时,必须保证数据的完整性。这会给测试和开发带来极大的不便。
- 测试环境复杂:为了保证数据完整性,测试时需要在额外的十几张乃至几十张的主表中添加基础数据,增加了复杂性和工作量。
性能问题
额外的数据一致性校验查询
额外查询:每次向订单明细表添加数据时,订单明细表必须额外查询订单表以检查订单ID是否存在,产生额外的处理,降低性能。
并发性问题
- 行级锁:外键约束会启用行级锁,主表在写入时会进入阻塞状态。
- 共享锁与写锁:在并发环境下,每次由订单明细表向订单表检查关系时,会在订单表开启共享锁(读锁)。
- 如果有外部请求对订单ID进行写入或更新操作,会持有排他锁(写锁),导致订单明细表的写操作阻塞,形成大量线程积压,可能造成系统延迟和崩溃。
级联删除的问题
- 多层级联删除:多层级联删除会让数据变得不可控。例如,删除订单类型表中的一条数据,会级联删除订单表和订单明细表中的相关数据,导致数据流向不可控,无法追溯。
- 触发器问题:触发器在实际开发中也是严格禁用的,因为它们会在某个字段上绑定触发条件,导致数据操作不可控。
数据库层面的耦合
数据迁移维护困难:数据库层面的数据关系产生耦合,迁移和维护困难。例如,将订单明细表从MySQL迁移到HBase,数据类型和存储位置改变,原有的主外键约束失效,需要在程序中增加校验代码,增加了复杂性。
总结
以上就是结合我自己的理解,为大家讲解的阿里巴巴不推荐使用外键约束的因素。如果你觉得内容讲得还不错,麻烦给我点个赞,谢谢大家。