文章插图
【数据库中为什么不推荐使用外键约束】
首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整” 。因此,外键约束的存在,并非全然没有优点 。
1. 引言其实这个话题是老生常谈,很多人在工作中确实也不会使用外键 。包括在阿里的JAVA规范中也有下面这一条
【强制】不得使用外键与级联,一切外键概念必须在应用层解决 。
但是呢,询问他们原因,大多是这么回答的
每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便 。
坦白说,这么说也是对的 。但是呢,不够全面,所以开一文来详细说明 。
2. 正文首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整” 。因此,外键约束的存在,并非全然没有优点 。
比如使用外键,可以
- 保证数据的完整性和一致性
- 级联操作方便
- 将数据完整性判断托付给了数据库完成,减少了程序的代码量
然而,鱼和熊掌不可兼得 。外键是能够保证数据的完整性,但是会给系统带来很多缺陷 。正是因为这些缺陷,才导致我们不推荐使用外键,具体如下:
4. 并发问题在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁 。若是在高并发大流量事务场景,使用外键更容易造成死锁 。
5. 扩展性问题这里主要是分为两点
- 做平台迁移方便,比如你从MySQL迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便 。
- 分库分表方便,在水平拆分和分库的情况下,外键是无法生效的 。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦 。
技术问题
相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展 。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难 。
推荐阅读
- 中国最好的带鱼产自哪里
- 测试人员如何在linux服务器中查询mysql日志?
- IOS企业签名为什么又掉了,开发者如何自签?
- 网盘的劲敌!几T资料自动备份还更安全?NAS比你想象中更强大
- 如果再有人问你数据库的原理,把这篇文章给他
- 如何挑选蕨根粉
- 如何挑选败酱草
- 如何挑选珊瑚草
- 中国石油天然气集团|中石油发布22年招聘公告,共计划招录760人,专科生也有机会上岸
- 穿衣搭配|中长款的职场穿搭真有气质!简洁的服装即使是富丽颜色,也很美呢