数据库外键为什么被抛弃了?
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.数据库需要维护外键的内部管理: 2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成: 3.有了外键,当做一些涉及外键字段的增,删, ...
- mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作
1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...
- 数据库 外键 优缺点_不同数据格式的优缺点:键值与元组
数据库 外键 优缺点 by Hieu Nguyen (Jack) 由Hieu Nguyen(Jack) 不同数据格式的优缺点:键值与元组 (The pros and cons of different ...
- [转载]数据库外键的使用
[转载]数据库外键的使用 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有客户号,客户名称 ...
- 查看外键名称查看数据库外键名字
我们要进行删除外键时,需要知道外键的名字,那么如何查看数据库外键呢?有2种方式查看: 1.过查看表的方式查看外键名字: 2.通过mysql自带的系统表查看外键. 更多精彩请访问本文源地址: https ...
- wamp mysql外键设置_数据库外键是什么意思
数据库外键是什么意思? 外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列.通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接.这个列就成为第二个表的外键. 当创建或更 ...
- 深刻理解数据库外键含义
上课的时候老师讲的很清楚,但是毕竟没有实际操作数据库,思考和实践真的完全是不同层次的. 我的读者表里面全是学生这一类,外键约束使得学生这一类别在类别表中无法删除,就是因为读者表中的学生这一类在约束,试 ...
- java 数据库外键查询_oracle中查询所有外键引用到某张表的记录
其实查找这篇文章 我主要用的sql 是这句 select * from user_cons_columns t where t.constraint_name like 'FK_CTS_CONT_ ...
- 数据库设计中一个矛盾:数据库外键,用还是不用?你怎么看.?
最近在做一个派单系统数据库设计,在设计中有些疑惑的地方中午在网上发起一个话题讨论. 我把这个讨论流程.发过来 大家可以可以看看. 也可以发表一下自己的意见. 对于主/外键/索引来说,在一些开发团队中被 ...
最新文章
- python之⾯向对象-继承
- 通过Live Writer Blog客户端来写blog
- Java 9 - 17 特性解读:Java 11
- IDEA搭建Maven Web(SSM)项目(一)——创建项目
- 132.非对称加密?数据安全的特征?
- MIMIC 以太坊医疗项目开发(3)nodejs安装
- python的底层是c_python基本数据类型底层实现
- keras:Sequential API 和 Function API
- Android之解决多语言适配部分TextView内容左对齐和内容一行不排满就到第二行问题
- java8optional_关于Java 8的Optional的介绍
- android代码跳过锁屏,Android_android禁止锁屏保持常亮(示例代码),在播放video的时候在mediaplayer
m - phpStudy...
- 计算机应用基础知识点.pdf,计算机应用基础知识点11.pdf
- altas(ajax)控件(二):悬浮面板控件AlwaysVisibleControl
- Eclipse中如何更改工作空间(之前一直不知道,几天终于知道了!)。
- 如何在 M1 Mac 上运行Intel架构的应用程序?
- selenium调用浏览器进行抓取页面
- 读书笔记之《价值》张磊
- linux系统工具栏调整,Ubuntu 7.10任务栏不见了的解决办法
- 看网易云公开课代码性能开发有感,怎样提高代码的性能
- 重置帆软决策系统用户名密码
热门文章
- FFmpeg入门详解之14:FFmpeg简介
- 嵌入式学习之Linux系统编程---9 目录IO之readdir函数
- IP地址通信简单理解
- golang 搭建文件服务器,golang实现简单文件服务器
- linux mysql使用教程_Linux 下MySQL的安装及基本使用
- mysql表单结构类型int_MySQL的数据类型和表结构
- STUN和TURN 网络穿透技术浅析
- 专业级服务器监控产品 OneAPM Servers 上线
- containsKey和containsValue
- containskey(containskey()什么意思)