• <aside id="ZmGgu"></aside><progress id="ZmGgu"><tr id="ZmGgu"></tr></progress>

    <keygen id="ZmGgu"></keygen><param id="ZmGgu"></param><nav id="ZmGgu"></nav>
  • <output id="ZmGgu"><audio id="ZmGgu"><tr id="ZmGgu"></tr><small id="ZmGgu"><dfn id="ZmGgu"><em id="ZmGgu"></em></dfn></small></audio></output><sub id="ZmGgu"></sub>

    1. <del id="ZmGgu"></del>
      <var id="ZmGgu"><abbr id="ZmGgu"><option id="ZmGgu"></option></abbr></var>
    2. <video id="ZmGgu"><td id="ZmGgu"><ol id="ZmGgu"><fieldset id="ZmGgu"><embed id="ZmGgu"><style id="ZmGgu"></style><style id="ZmGgu"><th id="ZmGgu"></th></style></embed></fieldset></ol></td></video>
      |
      |
      51CTO旗下网站
      |
      |
      移动端

      数据库中为什么不推荐使用外键约束

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

      作者:孤独烟来源:数据库开发|2019-10-18 14:30

      引言

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

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

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

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

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

      正文

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

      比如使用外键,可以

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

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

      性能问题

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

      并发问题

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

      扩展性问题

      这里主要是分为两点

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

      技术问题

      使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了:芏嘀行⌒凸居捎谧式鹞侍,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。

      相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。

      【编辑推荐】

      1. 带你走近TiDB:一款开源NewSQL数据库
      2. MySQL数据库审计插件htp_audit正式开源,热璞科技回馈MySQL社区
      3. pydbgen:一个数据库随机生成器
      4. 监测数据库的健康和行为:有哪些重要指标?
      5. 从Gartner报告看中国数据库:差距虽在,“狼性”凸显
      【责任编辑:庞桂玉 TEL:(010)68476606】

      点赞 0
      分享:
      大家都在看
      猜你喜欢

      订阅专栏+更多

      活学活用 Ubuntu Server

      活学活用 Ubuntu Server

      实战直通车
      共35章 | UbuntuServer

      218人订阅学习

      Java EE速成指南

      Java EE速成指南

      掌握Java核心
      共30章 | 51CTO王波

      83人订阅学习

      Mysql DBA修炼之路

      Mysql DBA修炼之路

      MySQL入门到高阶
      共24章 | 武凤涛

      471人订阅学习

      读 书 +更多

      XML案例解析教程

      本书对开发XML应用程序给予了详细指导,其中一些应用程序甚至对于您来说是完全陌生的。这些应用程序包括XML 1.0,以及与XSLT、XQuery和XPat...

      订阅51CTO邮刊

      点击这里查看样刊

      订阅51CTO邮刊

      51CTO服务号

      51CTO播客