数据库外键为什么被抛弃了?

数据库外键为什么被抛弃了?1 背景其实这个话题是老生常谈 很多人在工作中确实也不会使用外键 包括在阿里的 JAVA 规范中也有下面这一条 强制 不得使用外键与级联 一切外键概念必须在应用层解决 但是呢 询问他们原因 大多是这么回答的 每次做 DELETE 或者 UPDATE 都必须考虑外键约束 会导致开发的时候很痛苦 测试数据极为不方便 坦白说 这么说也是对的 但是呢 不够全面 所以开一文来详细说明 2 正文首先我们明确一点 外键约束是一种约束 这个约束的存在 会保证表间数据的关系 始终完整 因此 外键约束的存在 并非全

1、背景

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

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

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

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

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

2、正文

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

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

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

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

2.1 性能问题

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

2.2 并发问题

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

2.3 扩展性问题

这里主要是分为两点:

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

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

2.4 技术问题


更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。
数据库外键为什么被抛弃了?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219519.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午10:22
下一篇 2026年3月17日 下午10:22


相关推荐

  • 用GHOST备份ubuntu系统

    用GHOST备份ubuntu系统
    由于在折腾ubuntu系统过程中经常出错(有一次由于更改分辨率导致黑屏,折腾了大半夜才修复好),于是特想能够找到一种简便有效的备份方法。

    上网一搜,老鸟们都说用tar备份。搜到了命令,复制下来,往终端上一贴,能进行,可是结尾时总出错。几个版本的命令都不行。经研究和上网搜索,搞明白这命令在纯文本(纯命令)下才行,桌面下根本不行(估计那些网上的tar备份者也是人云亦云,自己根本没试过)。

    Ctrl+Alt+F2进入纯命令界面,一片漆黑的背景上几个字母,根本

    2025年9月17日
    7
  • 史上最全69道Spring面试题和答案

    史上最全69道Spring面试题和答案目录Spring概述 依赖注入 Springbeans Spring注解 Spring数据访问 Spring面向切面编程(AOP) SpringMVCSpring 概述1. 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Ja…

    2022年5月11日
    37
  • common-dbutils.jar学习心得

    common-dbutils.jar学习心得

    2021年5月24日
    204
  • 图片和Base64编码相互转换[通俗易懂]

    图片和Base64编码相互转换[通俗易懂]https://www.cnblogs.com/hzhl/articles/14919747.html

    2022年6月5日
    29
  • JAVA四舍五入保留一位小数

    JAVA四舍五入保留一位小数newBigDecimal(speed).setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue()

    2022年5月11日
    58
  • git 修改用户名以及邮箱_注册github账号

    git 修改用户名以及邮箱_注册github账号1、查看命令gitconfig–local–list2、查看当前用户名gitconfiguser.name3、查看邮箱gitconfiguser.email4、修改用户名gitconfiguser.namexxx5、修改邮箱gitconfiguser.emailxxx

    2025年9月25日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号