外键带来的好处
数据一直性检查由数据库保证
外键带来的不便
1、测试成本高,麻烦
每次增删改时都要考虑到外键约束,在调试接口的时候很麻烦,且测试人员(很多黑盒测试人员玩不转)会要求开发提供测试数据。
调试麻烦、可能会浪费开发人员时间
2、并发阻塞
产生并发问题:外键约束会启用行级锁,主表写入时会阻塞
如:表A有个字段a是外键,a是表B的主键。对表A增删改时会对锁住表B的的一行数据。此时表B这行数据不可插入。
3、数据不可控
级联删除:删除主数据时,(主数据的id为其他表的外键)关联表数据也会删除
导致数据不可控(我明明只删除了表A一条数据,结果少了一大片数据…)
触发器也是同理,不建议使用(且维护起来比较懵逼)。
4、数据高度耦合
数据库层面 数据强耦合,如果产生数据迁移(特别是跨数据库类型的,如:mysql -> mongoDB),数据校验部分又需要在代码里补上。
那么不如一开始就在代码里体现,这样也好交接些(代码是些给接坑的同事看的)
5、影响数据库性能
有外键时,会先根据外键进行数据检查。
如:新增、删除操作时,数据库会先去检查外键对应的数据是否存在。
最后说下
我部门的一位架构大佬就喜欢使用外键,原因是:
1:外键保证数据一致性
2:系统一般不会存在迁移(mysql -> oracle、pg)
ps:但是私有化部署、清除测试数据、迁移到其他类型数据库时是真的恶心…