学习的文档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.mzph.cn/news/882227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode377:组合总和IV

题目链接&#xff1a;377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target 1, 0);dp[0] 1;for(int i 0; i < target; i){for(int…

【H∞鲁棒控制】状态反馈、输出反馈、混合灵敏度H∞控制器设计

最近在学H∞鲁棒控制&#xff0c;因为后面项目中可能要用到此控制方法&#xff0c;所以提前进行了学习&#xff0c;刚开始接触感觉看不太懂&#xff0c;涉及的数学专业知识较深&#xff0c;而且网上资料也比较零星且局限&#xff0c;摸爬了好几天才搞懂了点&#xff0c;现自己总…

「Java服务」快速接入SkyWalking方法指南

一、背景 背景&#xff1a;Apache SkyWalking 是一个开源的分布式应用性能监控&#xff08;APM&#xff09;系统&#xff0c;主要用于监控微服务、云原生和容器化应用的性能。接入SkyWalking可以排查以智能投放服务为主的服务响应问题 技术架构 SkyWalking 的核心架构包括以…

Spring Boot 集成 Elasticsearch入门教学

一、什么是 Elasticsearch (ES)? Elasticsearch 是一个分布式搜索引擎&#xff0c;用来处理大规模数据的存储、搜索和分析。它是基于 Apache Lucene 构建的&#xff0c;具备高效的全文搜索功能。ES 可以在海量数据中快速找到匹配的内容&#xff0c;并且支持复杂的查询逻辑&am…

银河麒麟V10系统+Windows10双系统启动顺序正确修改方法

***正确可行方法***&#xff0c;测试OK且稳定&#xff1b; 银河麒麟桌面操作系统V10是一款适配国产软硬件平台并深入优化和创新的新一代图形化桌面操作系统&#xff0c;同源支持国内外主流处理器架构&#xff0c;并不断使能GPU、桥片、网卡等各种新硬件&#xff0c;提供更优的软…

vue3学习之插槽slot

关于slot web组件内部的占位符&#xff0c;可以使用自己的标记填充这个占位符 &#xff0c;具名插槽就是在slot标签上添加name属性&#xff08;https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/slot&#xff09; vue3官方文档&#xff1a;https://cn.vuejs.org/gui…

深入解析Java 22:专栏介绍

深入解析Java 22&#xff1a;专栏介绍 Java&#xff0c;作为一种广泛使用的编程语言&#xff0c;一直以来都在不断地发展和改进。2024年3月19日&#xff0c;Java 22的GA版本正式发布&#xff0c;带来了众多令人瞩目的新特性和性能优化。本专栏将深入解析Java 22&#xff0c;带…

AD9680(adc直采芯片)使用说明

写这篇文章之前我是没有使用过AD9680的芯片&#xff0c;但是使用过GMS011芯片&#xff08;是国内24S&#xff09;下的公司出来的芯片&#xff0c;寄存器和管脚全对标。 在这里我就大概说一下芯片的说用方法 一、硬件设计 该芯片支持双通道射频直采 支持协议JESD204B 14位 采样…

leetcode二叉树(五)-二叉树层序遍历

题目 102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7…

MySQL中FIND_IN_SET(),IN()和LIKE区别

在 MySQL 中&#xff0c; FIND_IN_SET() 和 LIKE 都可以用于字符串的匹配查找&#xff0c;但它们有以下不同&#xff1a; 一、语法及功能 1. FIND_IN_SET(str,strlist) &#xff1a; 用于在以逗号分隔的字符串列表中查找特定字符串&#xff0c;并返回其位置。如果未找到则返…

【网络篇】计算机网络——网络层详述(笔记)

目录 一、网络层 1. 网络传输流程简述 2. 转发和路由选择 3. 控制平面&#xff1a;SDN 方法 二、路由器工作原理 1. 概述 &#xff08;1&#xff09;输入端口 &#xff08;2&#xff09;交换结构 &#xff08;3&#xff09;输出端口 &#xff08;4&#xff09;路由选…

CAS详谈---无锁的锁机制

假设有多个线程想要操作同一个资源对象&#xff0c;我们首先想到的是使用互斥锁&#xff0c;但是互斥锁是悲观的。 悲观&#xff0c;即操作系统会悲观的认为如果不严格同步线程调用&#xff0c;那么一定会产生异常&#xff0c;所以互斥锁会将资源锁定&#xff0c;只供一个线程…

Django CORS配置方案

参考 https://pypi.org/project/django-cors-headers/ 在setting.py中设置 INSTALLED_APPS [......corsheaders, #添加此行 ]MIDDLEWARE[......corsheaders.middleware.CorsMiddleware, #添加此行django.middleware.common.CommonMiddleware,#django.middleware.csrf.CsrfVi…

【动手学深度学习】7.5 批量规范化(个人向笔记)

训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使它们收敛更加棘手。而本节的批量规范化&#xff08;batch normalization&#xff09; 可以持续加速深层网络的收敛速度结合下节会介绍道德残差块&#xff0c;批量规范化使得研究人员能够训练100层以上的网络 1.…

el-input设置placeholder字体大小

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、el-input设置placeholder字体大小&#xff1f; 一、el-input设置placeholder字体大小&#xff1f; .el-input__inner::placeholder {font-size: 12px;}

nbsaas vue3管理后台框架

nbsaas vue3管理后台框架 一、项目概述 Nbsaas Admin Vue 是一个基于 Vue.js 3.0 构建的轻量级后台管理系统&#xff0c;结合了现代前端技术栈的最佳实践&#xff0c;旨在帮助开发者快速构建具有高可扩展性和良好用户体验的后台管理系统。该项目拥有简洁的 UI 设计&#xff0…

Hikyuu教程 | 滚动回测与滚动寻优系统

前面介绍了如何使用 hikyuu 进行策略回测参数优化&#xff0c;同时也提到了这种简单的参数优化本质其实是对历史数据的过拟合&#xff0c;通常并不具备直接使用的意义。那么有什么办法来减缓这种过拟合影响&#xff0c;让参数优化发挥实际的作用呢&#xff1f;答案是——使用滚…

使用shell脚本自动重启服务

服务器后台运行的一些服务&#xff0c;有的时候由于高压操作导致服务崩溃时&#xff0c;总是得远程登录服务器&#xff0c;然后重启服务。 可以写shell脚本自动检测服务是否在运行&#xff0c;如果崩溃了就重启。 使用nohup在后台启动服务&#xff1a; nohup 服务启动命令所…

ifconfig 和 ip addr

1. 工具所属套件 ifconfig&#xff1a;属于较老的 net-tools 套件。曾是 Unix 和 Linux 系统上广泛使用的工具。ip addr&#xff1a;属于较新的 iproute2 套件。它取代了 ifconfig&#xff0c;并逐渐成为现代 Linux 系统上更常用的工具。 2. 功能覆盖范围 ifconfig&#xff…

Java之数组详解

一、数组的概念 数组&#xff08;Array&#xff09;是多个相同类型数据按一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c;通过编号&#xff08;索引&#xff09;的方式对这些数据进行统一管理。数组是程序设计中的一种基本数据结构&#xff0c;用于存储相同类型…