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

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

阿里JAVA规范


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


外键的优缺点


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

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


外键案例分析


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


4.png


1.性能问题


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


2. 并发问题


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


3.级联删除问题


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

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


5.png


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

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


4.数据耦合和迁移


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


6.png


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

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


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


目录
相关文章
|
设计模式 前端开发 Java
DTO和VO的区别及使用场景详解
DTO和VO的区别及使用场景详解
8420 1
|
Java 关系型数据库 MySQL
阿里巴巴Java开发手册简介(终极版、华山版、泰山版)(附下载地址)
阿里巴巴Java开发手册简介(终极版、华山版、泰山版)(附下载地址)
9745 0
|
索引 存储 数据库
数据库设计规范
基于阿里数据库设计规范扩展而来
51314 4
|
设计模式 Java 数据库
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景
从多个层面分析数据库外键的优缺点,并给出外键的使用场景和禁止使用的场景。
1573 19
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
31167 73
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
13980 2
|
消息中间件 Java 中间件
MQ四兄弟:如何保证消息可靠性
本文介绍了RabbitMQ、RocketMQ、Kafka和Pulsar四种消息中间件的可靠性机制。这些中间件通过以下几种方式确保消息的可靠传输:1. 消息持久化,确保消息在重启后不会丢失;2. 确认机制,保证消息从生产者到消费者都被成功处理;3. 重试机制,处理失败后的重试;4. 死信队列,处理无法消费的消息。每种中间件的具体实现略有不同,但核心思想相似,都是从生产者、中间件本身和消费者三个角度来保障消息的可靠性。
771 0
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
49694 6
|
SQL 监控 Java
【开发规范系列】(三)代码提交规范
【开发规范系列】(三)代码提交规范
|
存储 缓存 安全

热门文章

最新文章