开发规范中为什么要禁用外键约束

简介: 开发规范中为什么要禁用外键约束

阿里JAVA规范


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


外键的优缺点


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

优点:保证数据的完整性和一致性,级联操作方便,数据的一致性交给数据库,代码量小。


外键案例分析


如下图所示,订单表有订单id和其他属性,订单明细表有订单明细id、订单id(外键)和其他属性。


4.png


1.性能问题


额外的数据一致性校验查询。当每一次向订单明细表添加数据时,会检查订单表里是否存在对于的外键约束数据id是否存。


2. 并发问题


**外键约束会启用行级锁,主表写入时会进入阻塞。**每一次在订单明细表插入数据会检查订单明细表的记录,此时会给该订单id添加一个读锁。在并发条件下,如果此时甭管什么原因,此时有个请求需要修改订单表的订单 ID ,此时订单表就会开启一个写锁。那么此时订单明细表就会进入一个阻塞的状态,就行进行一个线程的挤压,进而引发系统崩溃。


3.级联删除问题


多层级联删除会让数据变得不可控,触发器也严格被禁用。

数据关系如下图所示,订单表里有订单类型的外键,订单明细表里有订单表的外键。


5.png


如果此时我们想删除订单类型,应为订单表与订单类型表存在外键约束关系,那么对于的订单表里的此类型的订单都将会被删除,订单明细表的明细也将会删除。如果存在更多的外键约束关系,则会删除一连串的数据,此时就会变得不可控。这好比一个树,订单类型表是树根,订单表是树枝,订单明细表是树叶,如果删除树根,则树枝和树叶也会被删除,那结果太可怕了。

这些操作都是在数据库层面发生的,都是无法追溯的,是一件很麻烦的事。所以在实际开发中数据库层面的外键约束是严令禁止的。


4.数据耦合和迁移


数据库层面数据关系产生耦合,数据迁移维护困难。


6.png


如果某一天,订单明细表的数据量过大,基于 MySQL 本身的性能应用已经不足以支持相对应的业务需求。此时计划将订单明细数据迁移到 HBASE 这样的大数据数据库进行存储。

那么此时是不是需要将原有的主外键约束关系给去掉,之后又如何保证数据的一致性问题呢,此时只能通过程序层面进行约束,这是不是又回到了应用层面。


在实际的项目经验过程中,随着业务发展,有些业务数据就会非常大,因为MySQL关系型数据库本身的性能问题,此时有些数据就会进行一些迁移,这是非常常见的,而此时就需要在应用层面确保数据的一致性,所以也就是有些公司为什么不推荐使用外键约束的原因。


目录
相关文章
|
索引 存储 数据库
数据库设计规范
基于阿里数据库设计规范扩展而来
52610 4
|
SQL 关系型数据库 MySQL
将MySQL 数据迁移到 PostgreSQL
将MySQL 数据迁移到 PostgreSQL 可以采用以下步骤: 安装 PostgreSQL 数据库:首先,需要安装 PostgreSQL 数据库。可以从官方网站(https://www.postgresql.org/)下载最新版本的 PostgreSQL,并根据官方指南进行安装。 创建 PostgreSQL 数据库:在 PostgreSQL 中创建与 MySQL 数据库相对应的数据库。可以使用 pgAdmin 或命令行工具(如 psql)来创建数据库。例如,如果在 MySQL 中有一个名为 "mydb" 的数据库,那么可以在 PostgreSQL 中创建一个具有相同名称的数据库。 导
6682 0
|
设计模式 Java 数据库
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景
从多个层面分析数据库外键的优缺点,并给出外键的使用场景和禁止使用的场景。
2406 19
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景
|
SQL 分布式计算 IDE
如何在IDE中通过Spark操作Hive
通过以上方法和代码示例,你可以在IDE中成功通过Spark操作Hive,实现大规模数据处理和分析。确保理解每一步的实现细节,应用到实际项目中时能有效地处理各种复杂的数据场景。
841 28
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
16888 1
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
机器学习/深度学习 人工智能 达摩院
ClearerVoice-Studio:阿里通义开源的语音处理框架,提供语音增强、分离和说话人提取等功能
ClearerVoice-Studio 是阿里巴巴达摩院通义实验室开源的语音处理框架,集成了语音增强、分离和音视频说话人提取等功能。该框架基于复数域深度学习算法,能够有效消除背景噪声,保留语音清晰度,并提供先进的预训练模型和训练脚本,支持研究人员和开发者进行语音处理任务。
4363 3
ClearerVoice-Studio:阿里通义开源的语音处理框架,提供语音增强、分离和说话人提取等功能
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
153110 0
|
Java Android开发
IDEA设置项目编码格式【修改为GBK 或 UTF-8】
这篇文章介绍了在IntelliJ IDEA中如何设置项目编码格式,包括将项目编码修改为GBK或UTF-8的详细步骤和图解。
25118 12
IDEA设置项目编码格式【修改为GBK 或 UTF-8】
阿里云镜像公共仓库使用
这篇文章介绍了如何使用阿里云镜像公共仓库,包括登录管理界面、创建命名空间、推送和拉取镜像的详细步骤。
14854 5
阿里云镜像公共仓库使用

热门文章

最新文章