引言
其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
但是呢,询问他们原因,大多是这么回答的
每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。
坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。
正文
首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整”。因此,外键约束的存在,并非全然没有优点。
比如使用外键,可以
然而,鱼和熊掌不可兼得。外键是能够保证数据的完整性,但是会给系统带来很多缺陷。正是因为这些缺陷,才导致我们不推荐使用外键,具体如下:
性能问题
假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。
并发问题
在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。
扩展性问题
这里主要是分为两点
技术问题
使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。
相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。
233酱工作中使用了一点ELK,偶尔使用Kibana拼接ES DSL简直要命。如果你和我一样...
本文为大家介绍了JSP自定义标签的案例,供大家参考,具体内容如下 案例一:实现...
自 2019 年首次亮相以来, Windows Terminal 已经走过了很长的一段路,微软也一...
本文主要和大家分享一下redis的高级特性:bit位操作。 力求让大家彻底学会使用re...
PHP正则表达式替换实现 是如何的呢?首先向你介绍下 PHP preg_replace,PHP preg...
获取用户信息 第一种官方不推荐 !-- 获取用户名 -- view 当前用户名{{name}} / v...
复制代码 代码如下: wmode参数: transparent模式:可用z-index控制层级 opaque...
jsp 开发之struts2中s:select标签的使用 1.第一个例子: s:select list="{'aa','...
ListBox控件的使用: 1)控件属性 Items SelectedItems SelectioModes 2)数据绑...
一般我们在ASP环境下,运行动生静操作时都用到的是FSO,他是专门对文件进行操作的...