当前位置: 首页 > article >正文

学习的文档10/14

为什么不推荐使用外键与级联?

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

说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度(来源于阿里巴巴开发手册

 为什么不要用外键呢?大部分人可能会这样回答:

  1. 增加了复杂性: a. 每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便; b. 外键的主从关系是定的,假如那天需求有变化,数据库中的这个字段根本不需要和其他表有关联的话就会增加很多麻烦。
  2. 增加了额外工作:数据库需要增加维护外键的工作,比如当我们做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,保证数据的的一致性和正确性,这样会不得不消耗数据库资源。如果在应用层面去维护的话,可以减小数据库压力;
  3. 对分库分表不友好:因为分库分表下外键是无法生效的。
  4. ……

我个人觉得上面这种回答不是特别的全面,只是说了外键存在的一个常见的问题。实际上,我们知道外键也是有很多好处的,比如:

  1. 保证了数据库数据的一致性和完整性;
  2. 级联操作方便,减轻了程序代码量;
  3. 等。。。。。。

所以说,不要一股脑的就抛弃了外键这个概念,既然它存在就有它存在的道理,如果系统不涉及分库分表,并发量不是很高的情况还是可以考虑使用外键的。

 什么是存储过程?

我们可以把存储过程看成是一些 SQL 语句的集合,中间加了点逻辑控制语句。存储过程在业务比较复杂的时候是非常实用的,比如很多时候我们完成一个操作可能需要写一大串 SQL 语句,这时候我们就可以写有一个存储过程,这样也方便了我们下一次的调用。存储过程一旦调试完成通过后就能稳定运行,另外,使用存储过程比单纯 SQL 语句执行要快,因为存储过程是预编译过的。

存储过程在互联网公司应用不多,因为存储过程难以调试和扩展,而且没有移植性,还会消耗数据库资源。

阿里巴巴 Java 开发手册里:要求禁止使用存储过程。下载地址:Java手册页面-阿里云开发者社区-阿里云官网开发者社区_云计算社区

 drop、delete 与truncate 区别?

用法不同:

  • drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时候使用。
  • truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
  • delete(删除数据) : delete from 表名 where 列名=值,删除某一行的数据,如果不加 where 子句和truncate table 表名作用类似。

truncate 和不带 where子句的 delete、以及 drop 都会删除表内的数据,但是 truncatedelete 只删除数据不删除表的结构(定义),执行 drop 语句,此表的结构也会删除,也就是执行drop 之后对应的表不复存在

 属于不同的数据库语言:

truncatedrop 属于 DDL(数据定义语言)语句,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。而 delete 语句是 DML (数据库操作语言)语句,这个操作会放到 rollback segment 中,事务提交之后才生效。

总结

  • 如果要删除整个数据库对象,使用drop
  • 如果要删除表中的部分行数据,可以使用delete并配合WHERE子句。
  • 如果要快速删除表中的所有数据且不需要恢复数据,可以使用truncate


http://www.kler.cn/a/355345.html

相关文章:

  • 教育行业 UI 设计基础篇:简洁直观的风格打造
  • 云手机+YouTube:改变通信世界的划时代技术
  • 大型语言模型(LLMs)演化树 Large Language Models
  • 自动控制系统综合与LabVIEW实现
  • 移动端网页兼容适配方案小结
  • 使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案
  • 系统共享库(Shared Library)
  • 重置时把el-tree树节点选中状态取消
  • Flink有状态计算
  • 【Golang】合理运用泛型,简化开发流程
  • ubuntu 使用appimage安装的应用,应该怎么创建桌面的快捷方式
  • 设定一个抽奖系统
  • Java高级Day54-正则表达式底层实现
  • Kerberos4简单复现
  • IP不纯净的后果及解决方案
  • 【JPCS独立出版,EI检索稳定】第三届能源互联网及电力系统国际学术会议(ICEIPS 2024)
  • React Componet类组件详解(老项目)
  • 数据结构编程实践20讲(Python版)—10B+树
  • Nature Communications 英国伦敦大学等提出仿生自适应多平面触觉系统,实现机械与振动双重感知结合
  • IC验证面试中常问知识点总结(四)附带详细回答!!!
  • 使用Python的socket库实现两台服务器TCP协议的数据发送和接收
  • MongoDB文档的详细使用说明
  • 韩信走马分油c++
  • asp.net core Partial 分部视图、视图组件(core mvc 才支持)、视图、razor page、mvc
  • 在 Android 开发中,如何实现蓝牙连接设备?
  • LIN从节点:识别帧头各场长度测试