美文网首页MySQL
【MySQL】为什么在MySQL数据库中不推荐使用外键

【MySQL】为什么在MySQL数据库中不推荐使用外键

作者: Shang_SRant | 来源:发表于2020-02-22 12:22 被阅读0次

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

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

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

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

  坦白说,这么说也是对的。但是呢,不够全面。

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

  比如使用外键,可以

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

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

性能问题

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

并发问题

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

扩展性问题

  这里主要是分为两点:

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

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

技术问题

  使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。

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

相关文章

  • 【MySQL】为什么在MySQL数据库中不推荐使用外键

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

  • mysql基本操作

    mysql; 登录: mysql:mysql -u root proot; 创建数据库:;(推荐使用此代码创数据库...

  • mysql基础

    mysql添加外键的4种方式 MySQL基础考点1 MySQL基础考点2 MySQL数据库六大设计规范总结1 My...

  • clickhouse导入MySQL的数据

    1.使用MySQL表引擎 这个非常垃圾,强烈不推荐使用。 2.物化mysql数据库引擎 这个是数据库引擎,意味着把...

  • 《MyBaits操作经验》

    MyBatis-------批量插入 一、在MySQL数据库中 在mysql数据库中,使用的是foreach标签。...

  • 在django下使用mysql(1)

    1、使用终端命令启动mysql 2、在MySql中创建Django项目的数据库 3、在MySql中为Django项...

  • 设置外键,外键约束值的区别

    laravel 设置外键,并设置外键约束的方式 为联级删除 更新:在使用Navicat for mysql设计表时...

  • aa

    在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 在 MySQL 中只有使用了 In...

  • MYSQL 基本语法(中篇)

    @[TOC] MYSQL 自动提交模式(autocommit) 在 MySQL 中只有使用了 Innodb 数据库...

  • 4.4 django 模型外键和表关系

    外键和表关系 外键: 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是Inn...

网友评论

    本文标题:【MySQL】为什么在MySQL数据库中不推荐使用外键

    本文链接:https://www.haomeiwen.com/subject/mohlqhtx.html