为什么禁用数据库外键?

外键带来的好处

数据一直性检查由数据库保证

外键带来的不便

1、测试成本高,麻烦

每次增删改时都要考虑到外键约束,在调试接口的时候很麻烦,且测试人员(很多黑盒测试人员玩不转)会要求开发提供测试数据。
调试麻烦、可能会浪费开发人员时间

2、并发阻塞

产生并发问题:外键约束会启用行级锁,主表写入时会阻塞
如:表A有个字段a是外键,a是表B的主键。对表A增删改时会对锁住表B的的一行数据。此时表B这行数据不可插入。

3、数据不可控

级联删除:删除主数据时,(主数据的id为其他表的外键)关联表数据也会删除
导致数据不可控(我明明只删除了表A一条数据,结果少了一大片数据…)
触发器也是同理,不建议使用(且维护起来比较懵逼)。

4、数据高度耦合

数据库层面 数据强耦合,如果产生数据迁移(特别是跨数据库类型的,如:mysql -> mongoDB),数据校验部分又需要在代码里补上。
那么不如一开始就在代码里体现,这样也好交接些(代码是些给接坑的同事看的)

5、影响数据库性能

有外键时,会先根据外键进行数据检查。
如:新增、删除操作时,数据库会先去检查外键对应的数据是否存在。

最后说下

我部门的一位架构大佬就喜欢使用外键,原因是:
1:外键保证数据一致性
2:系统一般不会存在迁移(mysql -> oracle、pg)

ps:但是私有化部署、清除测试数据、迁移到其他类型数据库时是真的恶心…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值