一、
使用外键,每次更新或删除操作都必须考虑外键约束,造成开发和测试的不方便 二、在阿里的java规范中,有一条:
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。三、外键:
好处:
1 可以保证数据的完整性和一致性; 2 级联操作比较方便; 3 将数据完整性判断托付给数据库完成,减少了程序的代码量。坏处:
一、性能问题
比如有一张表,有三个外键,每次新增数据,都需要检查三个外键对应表中是否有对应数据。sql的执行时间会更长。 此类检查,完全可以在应用层去解决,不用交付给数据库。二、并发问题
在高并发大流量的场景中,使用外键容易造成死锁。因为修改数据时需要查询对应的外键表可能会获取额外的锁。这个和Innodb的锁机制有关。三、扩展性问题
做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。 分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。- 四、数据库需要额外的维护外键的内部管理
五、技术问题
如果大量的使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。数据库的性能开销变大,对DBA的要求更高。如果数据约束逻辑在应用程序中,在应用服务器性能不够,可以做水平扩展,加机器。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难,可能会成为性能瓶颈,受IO能力限制。
四、不使用外键:
坏处:
删除数据,可能会遗漏对应的数据,造成脏数据。 约束逻辑,需要在逻辑层实现。 消耗服务器的性能。 五、总结:
外键是否使用,需要综合考虑,诸多因素,妥善处理。 继续阅读与本文标签相同的文章
-
阿里技术专家详解 DDD 系列- Domain Primitive
2026-05-19栏目: 教程
-
SSH、SSM项目在没有使用maven的情况下,使用tomcat 启动
2026-05-19栏目: 教程
-
在 NAS SMB 卷上用 Visual Studio 调试 ASP.NET + SQLServer 项目并部署到 IIS 服务
2026-05-19栏目: 教程
-
阿里云混合云备份如何还原文件备份?
2026-05-19栏目: 教程
-
云原生生态周报 Vol. 17 | Helm 3 发布首个 beta 版本
2026-05-19栏目: 教程
