1、背景

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

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

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

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

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

2、正文

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

保证数据的完整性和一致性;级联操作方便;

将数据完整性判断托付给了数据库完成,减少了程序的代码量;

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

2.1 性能问题

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

2.2 并发问题

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

2.3 扩展性问题

这里主要是分为两点:

(1)做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。

(2)分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。

2.4 技术问题

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


更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。

数据库外键为什么被抛弃了?相关推荐

  1. 数据库外键的使用原则

    作用:保持数据的一致性.完整性 为何说外键有性能问题: 1.数据库需要维护外键的内部管理: 2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成: 3.有了外键,当做一些涉及外键字段的增,删, ...

  2. mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  3. 数据库 外键 优缺点_不同数据格式的优缺点:键值与元组

    数据库 外键 优缺点 by Hieu Nguyen (Jack) 由Hieu Nguyen(Jack) 不同数据格式的优缺点:键值与元组 (The pros and cons of different ...

  4. [转载]数据库外键的使用

    [转载]数据库外键的使用 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 ...

  5. 查看外键名称查看数据库外键名字

    我们要进行删除外键时,需要知道外键的名字,那么如何查看数据库外键呢?有2种方式查看: 1.过查看表的方式查看外键名字: 2.通过mysql自带的系统表查看外键. 更多精彩请访问本文源地址: https ...

  6. wamp mysql外键设置_数据库外键是什么意思

    数据库外键是什么意思? 外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列.通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接.这个列就成为第二个表的外键. 当创建或更 ...

  7. 深刻理解数据库外键含义

    上课的时候老师讲的很清楚,但是毕竟没有实际操作数据库,思考和实践真的完全是不同层次的. 我的读者表里面全是学生这一类,外键约束使得学生这一类别在类别表中无法删除,就是因为读者表中的学生这一类在约束,试 ...

  8. java 数据库外键查询_oracle中查询所有外键引用到某张表的记录

    其实查找这篇文章  我主要用的sql 是这句  select * from user_cons_columns t where t.constraint_name like 'FK_CTS_CONT_ ...

  9. 数据库设计中一个矛盾:数据库外键,用还是不用?你怎么看.?

    最近在做一个派单系统数据库设计,在设计中有些疑惑的地方中午在网上发起一个话题讨论. 我把这个讨论流程.发过来 大家可以可以看看. 也可以发表一下自己的意见. 对于主/外键/索引来说,在一些开发团队中被 ...

最新文章

  1. python之⾯向对象-继承
  2. 通过Live Writer Blog客户端来写blog
  3. Java 9 - 17 特性解读:Java 11
  4. IDEA搭建Maven Web(SSM)项目(一)——创建项目
  5. 132.非对称加密?数据安全的特征?
  6. MIMIC 以太坊医疗项目开发(3)nodejs安装
  7. python的底层是c_python基本数据类型底层实现
  8. keras:Sequential API 和 Function API
  9. Android之解决多语言适配部分TextView内容左对齐和内容一行不排满就到第二行问题
  10. java8optional_关于Java 8的Optional的介绍
  11. android代码跳过锁屏,Android_android禁止锁屏保持常亮(示例代码),在播放video的时候在mediaplayer m - phpStudy...
  12. 计算机应用基础知识点.pdf,计算机应用基础知识点11.pdf
  13. altas(ajax)控件(二):悬浮面板控件AlwaysVisibleControl
  14. Eclipse中如何更改工作空间(之前一直不知道,几天终于知道了!)。
  15. 如何在 M1 Mac 上运行Intel架构的应用程序?
  16. selenium调用浏览器进行抓取页面
  17. 读书笔记之《价值》张磊
  18. linux系统工具栏调整,Ubuntu 7.10任务栏不见了的解决办法
  19. 看网易云公开课代码性能开发有感,怎样提高代码的性能
  20. 重置帆软决策系统用户名密码

热门文章

  1. FFmpeg入门详解之14:FFmpeg简介
  2. 嵌入式学习之Linux系统编程---9 目录IO之readdir函数
  3. IP地址通信简单理解
  4. golang 搭建文件服务器,golang实现简单文件服务器
  5. linux mysql使用教程_Linux 下MySQL的安装及基本使用
  6. mysql表单结构类型int_MySQL的数据类型和表结构
  7. STUN和TURN 网络穿透技术浅析
  8. 专业级服务器监控产品 OneAPM Servers 上线
  9. containsKey和containsValue
  10. containskey(containskey()什么意思)