数据库-基础理论

news/2024/11/25 21:59:36/

文章目录

  • 前言
  • 一、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.ppmy.cn/news/1549924.html

相关文章

ElementUI之el-date-picker禁选配置

​​​​​​​ElementUI之el-date-picker禁选配置 可以直接参考这篇博客论文

数据结构-图的遍历

一.深度优先搜素 遍历:把图中的每一个顶点访问一遍 把自己所能看见灯任意点亮然后依次进行点亮操作,当自己所能看见的灯全都被点亮,也不能直接从节点退出,而是回退然后继续进行上述操作 当所有的灯都被点亮了,一定要原路返回直到返回到出口…

贴代码框架PasteForm特性介绍之button,bitch,menu,ifmenu

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…

功能齐全,支持协作 | Docker部署一款支持多人共享的私密浏览器『n.eko』

功能齐全,支持协作 | Docker部署一款支持多人共享的私密浏览器『n.eko』 哈喽小伙伴们好,我是Stark-C~ 玩NAS的朋友基本都会在本地部署一款浏览器用来远程访问内网的网络设备,或者偶尔拿来浏览一些私密网站都是很方便的。 今天为大家分享的…

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析

目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …

litepal proguardFiles android studio

Step1:settings.gradle.kts or settings.gradle 添加阿里源 dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {maven(url "https://jitpack.io")maven (url "https://maven.aliyu…

wordpress二开-WordPress新增页面模板-说说微语

微语说说相当于一个简单的记事本,使用还是比较方便的。这个版本的说说微语CSS样式不兼容,可能有些主题无法适配,但是后台添加内容,前端显示的逻辑已经实现。可以当作Word press二开中自定义页面模板学习~ 一、后台添加说说微语模…

Java基础-内部类与异常处理

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Java 内部类 什么是内部类? 使用内部类的优点 访问局部变量的限制 内部类和继承 内部…