引言

其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

但是呢,询问他们原因,大多是这么回答的

每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。

坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。

正文

首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整”。因此,外键约束的存在,并非全然没有优点。
比如使用外键,可以

  • 保证数据的完整性和一致性
  • 级联操作方便
  • 将数据完整性判断托付给了数据库完成,减少了程序的代码量

然而,鱼和熊掌不可兼得。外键是能够保证数据的完整性,但是会给系统带来很多缺陷。正是因为这些缺陷,才导致我们不推荐使用外键,具体如下

性能问题

假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。

并发问题

在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。

扩展性问题

这里主要是分为两点

  • 做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。
  • 分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。

技术问题

使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。
相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。

转载于:https://www.cnblogs.com/rjzheng/p/9907304.html

【原创】数据库中为什么不推荐使用外键约束相关推荐

  1. mysql外键约束查询语句_MySQL数据库 : 查询语句,连接查询及外键约束

    查询指定字段        select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行)             select distinct 字段1,字段2.. ...

  2. MySQL—数据库表的完整性约束(非外键约束)

    完整性约束:为防止不符合规范的数据存入数据库,在用户对数据进行插入.修改.删除等操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是 ...

  3. Mysql数据库——数据表的优化、外键与三范式

    数据表优化 将商品信息表进行优化 1.创建商品种类表: create table if not exists goods_cates( id int unsigned primary key auto ...

  4. 外键查询_详解MySQL数据库删除所有表的外键约束、禁用外键约束相关脚本

    概述 数据库的外键虽然能保证数据数据一致性和完整性,但是也一定程度地影响了数据更新的性能.在开发中,我们使用PowerDesigner建立物理数据模型时,为了结构的清晰,增加可读性,会创建表与表之间的 ...

  5. navicat --mysql数据库外键约束及其外键策略

    一,什么是外键约束 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的.外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性. 外键是指 ...

  6. 外键约束(foreign key) [MySQL][数据库]

    外键约束(FOREIGN KEY(字段) REFERENCES 主表名(字段)) 外键约束的作用: 限定某个字段的引用完整性 我们之前在讲数据完整性的时候就提到过引用完整性 引用完整性(eg: 员工所 ...

  7. mysql删除表外键_MySQL删除所有表的外键约束、禁用外键约束

    数据库的外键虽然能保证数据数据一致性和完整性,但是也一定程度地影响了数据更新的性能.在开发中,我们使用PowerDesigner建立物理数据模型时,为了结构的清晰,增加可读性,会创建表与表之间的关联关 ...

  8. 详谈为什么互联网公司禁用外键约束

    禁用外键约束是什么 不得使用外键与级联,一切外键概念必须在应用层解决. 为什么禁用外键约束 首先,假设我们用了数据库约束外键,每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的 ...

  9. oracle 建立外键 引用条件约束 不能添加,Oracle外键约束(Foreign Key)的几个操作选项...

    关系型数据库是以数据表和关系作为两大对象基础.数据表是以二维关系将数据组织在DBMS中,而关系建立数据表之间的关联,搭建现实对象模型.主外键是任何数据库系统都需存在的约束对象,从对象模型中的业务逻辑加 ...

最新文章

  1. iPhone App开发导航条(Navigation Bar)素材PSD下载
  2. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
  3. 未解决:错误的结果 2 (从“D:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe”返回)。...
  4. 换个视角,从产品线管理看过去
  5. id int primary key auto_increment是什么意思
  6. Redis 数据结构与内存管理策略(上)
  7. linux之使用indent格式化代码总结
  8. hdfs的特性、命令、安全模式、基准测试
  9. Python+django网页设计入门(4):用户登录与登录验证
  10. python识别简单训练模型_Python-OpenCV —— 物体识别(TrainCascadeClassification)
  11. 计算机网络—时延相关真题练习(三)
  12. 从前端到后端的跨域攻击与防御
  13. JSP JavaBean作用范围
  14. 8 更新全局变量_2月26日守望先锋版本更新
  15. Java笔记:final修饰符
  16. winscp自动执行脚本
  17. 1111: 多个整数的逆序输出(函数专题)
  18. springboot做梦网云科技短信业务
  19. 使用ceres库将经纬度坐标GCJ02到WGS84精确转换
  20. python处理svg_用Python/PIL读取SVG文件

热门文章

  1. ashly理器4.8软件汉化版_AMD 处理器核心比英特尔多还更便宜?英特尔回应
  2. 命名空间不能直接包含字段或方法之类的成员是什么意思_Python 学习笔记之类与实例...
  3. html5与css3都要学吗,前端要学css3吗?
  4. android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②...
  5. cbrt c语音_isgraph - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  6. leetcode 47. 全排列 II 思考分析
  7. Opencv实战【3】——图像修复与图像锐化(darling in the franxx)
  8. 杭电2012-素数判定(C)
  9. cigarettes(香烟)
  10. java: 程序包lombok不存在_Java开发神器:Lombok 学习指南