数据库-基础理论

文章目录

  • 前言
  • 一、ORM框架
  • 二、ACID原则
  • 三、事务Transaction
  • 四、N+1问题
  • 五、Normalization三范式
  • 六、FMEA方法论(Failure Mode and Effects Analysis)
  • 七、Profiling和PerformanceSchema查询分析


前言

基础理论

ORM框架、ACID原则、事务Transaction、N+1问题、Normalization三范式、FMEA方法论(Failure Mode and Effects Analysis)、Profiling和PerformanceSchema查询分析等


一、ORM框架

ORM全称为对象关系映射(Object-Relational Mapping),是一种将对象模型和关系数据库之间进行映射的技术。
它的主要目的是为了简化开发人员在应用程序中访问数据库的过程,通过将面向对象的语言中的对象和类转化为关系型数据库中的表和行,使得开发人员可以使用面向对象的思维来操作数据库。

  1. 分类有三种:
  • 基于数据查询的ORM:通过将数据库查询结果映射为对象,以实现数据的读取、过滤和转换。
  • 基于对象操作的ORM:通过将对象转化为对应的SQL语句,以实现数据的增删改查操作。
  • 基于事务的ORM:通过将对象操作组合为一个事务,以确保数据的一致性和完整性。
  1. 优势:
  • 简化数据库操作:ORM工具隐藏了底层数据库的细节,使开发人员可以更加专注于业务逻辑的实现,而不必关心数据库操作的细节。
  • 提高开发效率:ORM工具自动生成数据库操作的代码,减少了手动编写SQL语句的工作量,同时还提供了很多常用的操作方法和功能,加快了开发速度。
  • 提高代码的可维护性:ORM工具将数据库操作和业务逻辑代码分离,使得代码更加清晰和易于维护。
  • 跨数据库的支持:ORM工具可以屏蔽不同数据库之间的差异,开发人员可以在不同的数据库之间切换而无需修改代码。
  • 提供缓存和性能优化:ORM工具通常具有缓存机制和性能优化功能,可以提高数据库查询的效率和性能。
  1. 应用场景:
  • Web应用开发:ORM工具可以方便地与前端开发技术(如HTML、CSS、JavaScript)结合,用于开发各种类型的Web应用。
  • 移动应用开发:ORM工具可以用于移动应用的后端开发,实现与数据库的交互。
  • 数据分析与报表生成:ORM工具可以用于从数据库中提取数据,并进行统计分析和报表生成。
  • 企业级应用开发:ORM工具可以与其他企业级框架(如Spring、Hibernate等)结合使用,实现大规模企业应用的开发和管理。

二、ACID原则

ACID 是用来描述数据库事务的属性。反过来说,满足 ACID 属性的一系列数据库操作被称为事务。

  • 原子性((Atomicity)事务是一个不可分割的最小操作单元,其对数据的修改,要么全都执行,要么全都不执行。意味着 “全有或全无”(All or Nothing)。
  • 一致性(Consistency):在事务开始和完成时,数据都必须保持一致状态。意味着数据库总是从一个一致性的状态转换到另外一个一致性的状态。。
  • 隔离性(Isolation)事务通常来说是不可见的,保证事务在不受外部并发操作影响的独立环境下运行。意味着一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性((Durability):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

下图解释了 ACID 在数据库事务中的含义。
ACID
对于单个节点的事务,数据库都是通过并发控制和恢复机制(日志技术)保证事务的ACID特性。
对于跨多个节点的分布式事务,通过两阶段提交协议(two phase commiting)来保证事务的ACID。

神书 DDIA (Designing Data Intensive Applications) 中关于 ACID 有几点很好的见地,值得我们思考:

  • 一致性其实是应用程序的责任,而不是数据库的职责范围。应用程序可以使用原子性和隔离来保证数据的一致性。而数据库系统只能保证各种数据库规则被执行了。
  • ACID 四个属性中只有隔离是用来描述并发情况的,原子性并不描述并发情况。
  • 各个弱隔离级别都会带来一些限制,我们需要清楚其底层机制。

三、事务Transaction

什么是事务?
事务是一组操作的集合,事务会把所有操作,作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

事务的特性:
数据库事务特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy)。简称ACID

基本操作:

-- 查看事务提交方式
SELECT @@AUTOCOMMIT;
-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

未开启事务:
模拟sql语句错误,此语句出错后张三钱减少但是李四钱没有增加

-- 1. 查询张三账户余额
select * from account where name = '张三';
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';

开启事务:

START TRANSACTIONBEGIN TRANSACTION;
-- 设置手动提交后上面代码改为:
start transaction; 
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

开启事务后,只有手动提交才会改变数据库中的数据。

并发事务:

问题描述
脏读一个事务读到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同(两次读取之间,有其他事务提交了导致)
幻读一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在

并发事务隔离级别:

隔离级别脏读不可重复读幻读
Read uncommitted 读未提交
Read committed 读已提交×
Repeatable Read(默认) 可重复读××
Serializable 串行化×××

√表示在当前隔离级别下该问题会出现
Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差

查看事务隔离级别:

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别:

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };

SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效

拓展:

  • 在SQL语句之后加上\G会将结果的表格形式转换成行文本形式
  • 查看Mysql数据库占用空间:
SELECT table_schema "Database Name", SUM(data_length + index_length) / (1024 * 1024) "Database Size in MB"
FROM information_schema.TABLES
GROUP BY table_schema;

四、N+1问题

五、Normalization三范式

三范式是具有最小冗余的表结构。具体如下:

  1. 第一范式(1st NF -列不可再分,原子性

第一范式的目标是确保每列的原子性,每列都是不可再分的最小数据单元(也称为最小的原子单元)。
1st NF
2. 第二范式(2nd NF-记录的唯一性约束,主键约束 )

第二范式要求每个表只描述一件事情。满足第一范式,并且表中非主键列不存在对主键的部分依赖
2nd NF
3. 第三范式(3rd NF- 字段冗余性的约束,外键约束

第三范式定义是,要求字段无冗余。满足第二范式,并且表中的列不存在对非主键列的传递依赖
除了主键订单编号外,顾客姓名依赖于非主键顾客编号。
3rd NF

六、FMEA方法论(Failure Mode and Effects Analysis)

七、Profiling和PerformanceSchema查询分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477874.html

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

相关文章

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)

反向传播(Backpropagation) 引言1. 分类交叉熵损失导数(Categorical Cross-Entropy loss derivative)2. 分类交叉熵损失导数 - 代码实现3. Softmax激活函数导数(Softmax activation derivative)4. Softmax激…

Transformer详解及衍生模型GPT|T5|LLaMa

简介 Transformer 是一种革命性的神经网络架构,首次出现在2017年的论文《Attention Is All You Need》中,由Google的研究团队提出。与传统的RNN和LSTM模型不同,Transformer完全依赖于自注意力(Self-Attention)机制来捕…

C0034.在Ubuntu中安装的Qt路径

Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录;

Swift 实现查找链表入环点:快慢指针法

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 142. 环形链表 II 不积跬步,无以至千里;不积小流,无…

stable-diffusion-webui在conda pycharm中运行

目录 简介下载conda环境配置环境变量修改launch_utils.py文件运行stable-diffusion-webui下载模型文本生成图片参考 简介 stable-diffusion-webui是AI绘画 Stable Diffusion浏览器UI界面,为用户提供了一个简单、直观的方式来利用 Stable Diffusion 技术创建视觉内容…

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(7)嵌入式Soc

越努力,越幸运! 分享一个晚霞,真的好美啊💖! 添加图片注释,不超过 140 字(可选) 不得不说,我还是喜欢在人少的地方生活啊。 flechazohttps://www.zhihu.com/people/ji…

【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践

文章目录 一、前言二、什么是“纵深安全防御”?三、为什么有必要采用纵深安全防御策略?四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…

产业用机器人中的旋转花键若损伤有何影响?

旋转花键在产业用机器人中是关键的组件之一,如果机器人中的旋转花键损坏,会对机器人的运行和性能产生一定影响。以下是可能的影响: 1、功能受限:旋转花键用于连接两个旋转部件(例如电机轴和传动轴)&#xf…

基于STM32的火灾报警装置的Proteus仿真

文章目录 一、火灾报警1.题目要求2.思路2.1 主控2.2 传感器2.3 设定阈值--按键2.4 报警和通风2.5 OLED显示2.6 电源部分2.7 远程终端 3.仿真3.1 未仿真时3.2 仿真开始,界面13.3 切换界面23.4 切换界面3 4.仿真程序4.1 程序说明4.2 主函数4.3 OLED显示函数 二、总结 …

人脸检测开源项目介绍【持续更新】

DeepFace 介绍:DeepFace是一个轻量级的人脸识别和面部属性分析框架,专为Python设计。它集成了多种前沿的深度学习模型,包括VGG-Face、FaceNet、OpenFace、DeepFace、DeepID、ArcFace、Dlib、SFace和GhostFaceNet等,能够进行年龄、…

RabbitMQ 之 死信队列

一、死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理 解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行…

使用 LSTM(长短期记忆网络) 模型对时间序列数据(航空旅客人数数据集)进行预测

代码功能 数据准备 加载数据:从公开的航空旅客人数数据集(Airline Passengers Dataset)中读取时间序列数据。 对数变换和平稳化:对数据应用 log1p 函数减少趋势和波动,使模型更容易学习规律。 归一化处理:…

《操作系统 - 清华大学》5 -2:覆盖技术

文章目录 1. 目标2. 覆盖的基本原理3. 覆盖技术的不足 1. 目标 覆盖技术产生于上世纪80年代和90年代初的时候,在那时候操作系统能力是很弱的,所以说当初目标是要在能够比较小的可用内存中运行比较大的程序,这个比较小,比较大的相对…

使用 Nginx 在 Ubuntu 22.04 上安装 LibreNMS 开源网络监控系统

#LibreNMS 是一个功能强大的开源网络监控系统,它能够为你的网络性能和设备提供全面的监控。本文将引导你通过一系列步骤,在 Ubuntu 22.04 服务器上安装和配置 LibreNMS,使用 Nginx 作为 Web 服务器。 简介 LibreNMS 提供了对网络设备和性能…

Spring注入Map学习

Spring注入Map学习 在Spring中 在策略模式中, 会经常用到 根据Bean名称获取Bean的实例 有2个方法很好用 1. 使用Autowired注入 2. 使用构造方法注入 但是奇怪的一点是: 日志打印并没有看到结果, 第一行的 Autowired的结果 是个null 那是因为 注入时机 的问题 注入时机&…

【Redis_Day5】String类型

【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…

谷歌云无法ssh登录(修改sshd_config也不行)

sudo -i vi /etc/ssh/sshd_config passwd root /etc/init.d/ssh restart service sshd restart 这是网站大部分教程讲的,但是我实际试了还是连不上 参考https://linux.do/t/topic/260732/15 原来/etc/ssh/sshd_config.d/下面有个60开头的文件,也需…

【FPGA-MicroBlaze】串口收发以及相关函数讲解

前言 工具:Vivado2018.3及其所对应的SDK版本 目前网上有许多MicroBlaze 的入门教程,比如下面的这个参考文章,用串口打印一个hello world。 【FPGA】Xilinx MicroBlaze软核使用第一节:Hello World!_fpga软核microblaze-CSDN博客 个…

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动,先不着急直接上手撸应用层的代码,先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码(vlc好像不支持h265,这个后边我试试)的视频流,先需要支持上rtsp server,了解rtsp协议是必…

渗透测试---shell(7)for循环2与while循环

声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人与泷羽sec团队一律不承担一切后果 视频地址:泷羽--shell&a…