为什么大厂都不推荐使用外键
阿里java规范
不得使用外键与级联,一切外键概念必须在应用层解决
外键的优缺点
外键的缺点
改、删时要考虑外键:每次做DELETE或者UPDATE都必须考虑到外键约束,不方便
表级锁导致并发差:并发问题外键约束会启用行级锁主表写入时会进入阻塞
级联删除问题:删除主表的一条记录,该记录外键关联的从表记录也会随之删除,导致数据不可控。例如删除“订单表”的一条订单,关联的“订单详情表”的一条记录也会随之删除。
耦合高、迁移麻烦:主表从表之间互相耦合,主表数据量过大要分表并迁移数据时,就必须先删除外键,不然你刚删完主表的一条记录,从表关联记录也级联删除了,导致数据丢失。
外键的优点
数据一致性:数据库通过外键可以保证数据的完整性和一致性。因为在更新主表记录时,从表对应的记录也会随之更改,并且更改时会加表级锁,以牺牲并发性为代价,保证数据的一致性。例如删除“订单表”的一条订单,关联的“订单详情表”的一条记录也会随之删除。
增加ER图的可读性:通过外键,可以更直观的看出表与表之间的关系。
级联操作方便,数据一致性交给数据库,代码量小
适用场景
哪些情况下不要用外键?为什么互联网大厂禁用外键约束
并发量高、表数据量大的分布式项目适合使用外键。防止每次更新数据时都要加表级锁,维护外键的一致性。
因为互联网大厂的产品并发量高,并且一般是分布式项目,为了提高数据库的并发性能,一般都禁用外键,在业务层面实现数据一致性,例如删除“订单表”一条记录前,先关联查询“订单详情表”的对应记录,然后先后一起删除。
哪些情况下可以用外键?
并发量不高,表数据量不大,对数据一致性要求较高的单体式项目适合使用外键