为什么不推荐使用外键?
阿里的开发手册中提到:【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
外键和主键一样,都是一种约束,外键约束也称为引用约束或引用完整性约束:
- 外键列必须引用另一个表中的主键或唯一键列
- 外键列必须满足引用完整性,也就是说,它们包含的值必须存在于被引用表的主键或唯一键列中
定义外键之后,数据库的每次操作都需要去检查外键约束。对于插入来说,影响了插入速度;对于更新来说,级联更新是强阻塞,存在数据库更新风暴(Database Update Storm
)的风险。
所谓 Database Update Storm
,指的是在高并发环境下,多个客户端同时对数据库进行大量的更新操作,存在锁竞争问题甚至死锁,从而导致数据库性能急剧下降或完全崩溃。
另外,当数据量非常大的时候,常见手段是分库分表,但外键通常难以跨越不同数据库来建立联系,数据的一致性更难维护。
因此,外键与级联并不适合分布式、高并发集群,但单机低并发业务可以考虑使用外键保证一致性和完整性。