其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条。
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
但是呢,询问他们原因,大多是这么回答的:
每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。
坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。
首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整”。因此,外键约束的存在,并非全然没有优点。
比如使用外键,可以保证数据的完整性和一致性级联操作方便,将数据完整性判断托付给了数据库完成,减少了程序的代码量
然而,鱼和熊掌不可兼得。外键是能够保证数据的完整性,但是会给系统带来很多缺陷。正是因为这些缺陷,才导致我们不推荐使用外键,具体如下:
性能问题
假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。
并发问题
在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。
扩展性问题
这里主要是分为两点:
1.做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。
2.分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。
技术问题
使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。
相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。

猜你喜欢
联络方式:
深圳 · 龙岗 · 大运软件小镇22栋302-308
电话:400 1828 580
邮箱:szhulian@qq.com



-
【通知】有关2019年元旦公司放假通知
新的一年即将到来,我们回首2018年,迎新2019年,最开心的事情,估计莫过于发工资和放假了。根据国务院办公厅《关于修改<全国年节及纪念日放假办法>的决定》,结合深正互联公司情况和大运软件小镇园区的放假安排,公司将2019年元旦放假有关事项通知如下...
-
html网页引用中文字体,文件过大,加载缓慢的解决办法
我们在日常需求中,经常会碰到视觉设计师对某个中文字体效果非常坚持的情况,因为页面是否高大上,字体选择是很重要的一个因素,选择合适的字体可以让页面更优雅。面对这种问题,我们通常以下方式来进行设计还原:
-
小程序、微商城、APP有什么区别
对于商家该选择哪个,想必通过以上对比,已有比较清晰选择。但再深入追踪,这个问题还得看商家对顾客的分层,不同层次关系的顾客,消费习惯不同,承载链接商家和顾客的终端也不一样,我个人认为顾客可归纳为三类
-
vuex是什么?与vue的关系又是什么
Vuex 是为vue.js开发提供的状态管理工具。在一个项目开发中频繁的使用组件传参的方式来同步data中的值,一旦项目变得很庞大,管理和维护这些值将是相当棘手的工作...
-
【通知】2021年元旦放假通知
根据《国务院办公厅关于2021年部分节假日安排的通知》的相关规定,结合深圳市大运软件小镇内部相关规定及深正互联具体的情况2021年元旦假期安排如下: