网站首页 > 技术文章 正文
在以前学习数据相关知识的时候,有幸阅读过阿里的数据库开发规范手册,里面提到一条强制等级的规范:不得使用外键与级联,一切外键概念必须在应用层解决。
当时我就很困惑,外键约束挺方便的,为什么大厂的规范中直接被强制禁用了?
虽然手册后面讲了原因,但当时身为小白的我还是一知半解的,直到在工作岗位上被“上了一课”。
数据库有无外键约束的区别
有外键
每次向数据库添加数据都需要去检查外键约束,检查关联表是否已经存在数据,硬性保持数据一致性,如果一条记录中存在多个外键,这样的buff还将会被叠加(性能损耗加成)。
无外键
不检查外键的合法性,直接插入。
外键在大型项目中带来的麻烦
数据库更新风暴: 在数据库系统中大规模的、瞬时性的更新操作,通常会导致数据库性能下降或者服务不稳定。这种情况通常发生在有大量并发用户或者应用程序同时对数据库进行写操作时,特别是在没有有效控制并发访问的情况下。
在发生数据库更新风暴时会导致的问题:
性能下降:大规模的写操作会导致数据库系统负载增加,可能导致查询响应时间延长或者系统整体性能下降。
锁竞争:多个并发写操作可能导致锁竞争,进而影响系统的并发性能和吞吐量。
死锁:如果更新操作涉及多个数据表或者多个数据行,并且没有正确处理事务和锁定,可能会导致死锁,进而影响系统稳定性。
数据一致性问题:大规模更新操作可能会导致数据一致性问题,例如数据丢失、数据错误或者数据不一致的情况发生。(数据缺失比数据错误要更严重。)
外键难以跨越数据库使用:在大型项目中,当数据量特别大的时候,一般会采取分库分表来存储数据。
但在不同的库中使用相同的外键来维护数据一致性和完整性是非常难的操作。所以在分布式、高并发集群的项目数据库中一般看不到外键的存在。
最后
外键是否采用,具体还要看业务应用场景,以及开发成本的。
中大型项目:
不推荐使用外键, 用户量大,并发高,数据库容易成为性能瓶颈,尤其受IO限制,此时不用外键,把数据一致性的控制放到程序事务中,易于水平扩展。
小型项目:
软件应用的用户数有限,数据量也一般不会超大,且活跃数据有限。即数据库服务器的性能不是问题,不用过多考虑性能问题。
- 上一篇: 数据库主键和外键
- 下一篇: mysql存在外键导入导出
猜你喜欢
- 2024-12-05 SQLite3:外键约束在命令行里不起作用,Navicat却无法插值
- 2024-12-05 学习VB编程第95天,使用sql命令创建修改删除数据库
- 2024-12-05 软考笔记|2-4 信息系统项目生命周期及典型模型
- 2024-12-05 多列数据删除重复值,快捷键Alt+D+P三步搞定,80%人没见过
- 2024-12-05 外键禁用,MySQL还能玩出什么花样?
- 2024-12-05 GBASE南大通用示例,使用 INDEX DISABLED 创建外键约束
- 2024-12-05 mysql外键实战
- 2024-12-05 mysql存在外键导入导出
- 2024-12-05 数据库主键和外键
- 2024-12-05 MySQL外键约束
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 534℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 496℃MySQL service启动脚本浅析(r12笔记第59天)
- 475℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 473℃启用MySQL查询缓存(mysql8.0查询缓存)
- 453℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 433℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 430℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)