数据管理基础
基于王珊《数据库系统概论》第 6 版
在燃神 @hr 总结的期末重点上进行注解。由于是后面才想起来有重点所以前三章没有整,如果有机会的话后面再补(虽然前几章也没有什么内容)
不考的内容里面也有一些很有趣的东西,说不定也会补,咕咕咕
作业非常重要!!!需要会!!!
#第一章
基本概念:三个模型与映射,理解针对什么东西
概念模型E-R图
逻辑模型中关于关系的基本概念
结构:三级模式两个映射
#第二章
关系、码、关系基本性质
关系的完整性:三类约束条件,如何利用其进行检查处理
关系代数,包括集合、符号、与关系有关的操作等,操作的含义、结果如何做的很重要,详细定义可以不知道,但要知道怎么执行。用关系代数表达一些语义
#第三章
sql,特征仅看过理解即可,了解性质
知道数据定义、语法、代表含义,利用语法定义表等均需要
数据查询单表、连接需要,嵌套不做要求,用连接完成即可,尽量别嵌套(有风险)
集合、创建视图、更新删除等也需了解
了解空值等概念,不会特别考,但要知道
整个sql没什么不要的东西
#第四章
存取控制,如何做?缺点在哪里?REVOKE、GRANT等语句
强制控制和自主控制均要知道怎么做、有何缺点,不会很细
自主:
1 | GRANT <权限类型> ON <对象类型> <对象名> TO <用户/角色> [WITH GRANT OPTION]; |
“授权蔓延”、难以撤销、不适合高安全性环境
强制:密级
实现复杂、管理开销大、灵活性差、主要用于高安全性领域
#第五章
详细讨论完整性,断言和触发器不作要求
完整性检查需要知道怎么做
-
实体完整性:
UNIQUE/NOT NULL
-
参照完整性:
FOREIGN KEY
ON DELETE NO ACTION
ON DELETE CASCADE
ON DELETE SET NULL
-
用户定义完整性:
- 属性上:
NOT NULL
UNIQUE
CHECK(expr)
:CHECK(Grade >= 0 AND Grade <= 100)
- 元组上:
CHECK(expr)
:CHECK(Ssex = '女' OR Sname NOT LIKE 'Ms.%')
- 也可以写成
CONSTRAINT <name> expr/UNIQUE/NOT NULL
- 属性上:
#第六章
BCNF之前需要知道,之后的不需要知道
函数依赖等需要知道,给出例子需要能判断范式级别,也要知道如何提升等级
范式详细定义不会考,只考判定
-
1NF:所有属性均不可分
-
2NF:所有非主属性均完全函数依赖于主码(不能只依赖于一部分)
- 反例:
学生_课程_教师 (*StudentID, CourseID*, StudentName, TeacherName)
中,StudentName
只依赖于StudentID
,etc. - 如何做到 2NF?把所有部分函数依赖的键和它们各自依赖的主码的子集分拆出来
- 反例:
-
3NF:所有非主属性都直接函数依赖于主码
- 反例:
员工 (*EmpID*, EmpName, DeptID, DeptName)
中,DeptName
间接依赖于EmpID
(因为直接依赖于DeptID
这个非主属性) - 如何做到 3NF?把所有传递依赖的属性和它们各自直接函数依赖的属性分拆出来
- 反例:
-
BCNF:所有决定因素(无论是主属性还是非主属性)都必须是超码
- 反例:
学生_课程_助教 (StudentID, Course, Assistant)
中,如果 一个学生在特定课程中只能有一个助教 且 一个助教只负责一门课程,则不是 BCNF。因为课程依赖于助教,而助教不是超码。 - 如何做到 BCNF?将不符合 BCNF 的关系进行分解,使得分解后的所有关系都满足 BCNF。
- 反例:
#第七章
数据分析不用太关注,要会绘制ER图
概念结构设计了解即可,如何将图拆开合并去除冗余,但是考试不是重点
逻辑结构设计转换要会做,ER图转换成表等
垂直和水平分解利弊需要知道,答题时要求举例一定要能够举例,什么时候用水平拆分,为什么用需要能说
物理模型设计:优化方式包括聚簇要求掌握,索引概念、创建索引等需要知道
E-R 图:
-
方框是实体
-
菱形是实体间的关系(1-1,1-n,m-n,或多元关系 etc.)
-
椭圆是实体或关系的(独有)属性
如何拆分 E-R 图:
-
属性不能再具有需要描述的性质
-
属性不能再与其它实体具有联系
如何合并 E-R 图:
-
属性冲突
- 属性域冲突:例如你用 0 1 我用 ‘MALE’ ‘FEMALE’,需要统一定义
- 属性取值单位冲突:例如你精确到年份我精确到日期,需要统一定义
-
命名冲突
- 同名异义,需要改名字
- 异名同义,需要改名字
-
结构冲突
- 同一对象有不同抽象:你用属性我用实体,需要修改
- 同一实体属性不同:你比我多属性,需要取并集
- 同一关系定义不同:你是一对一我是一对多,看情况保留或合并
逻辑结构设计转换:
-
一对一:可以合并到一端,或者单独分拆
-
一对多:可以合并到“对多”一端,或者单独分拆
-
多对多:单独分拆
-
多元:分拆
垂直分解:
-
垂直分解是将一张表的列拆分到多个新的表中。每个新表都包含原始表的主键,以及原始表的某些非主键列。核心思想是根据列的访问模式将列分组,把经常同时使用的属性放在一起。
- 利:
- 减少行宽
- 提高数据局部性:常用列放在一起,访问时数据更集中
- 弊:
- 增加 JOIN 操作
- 利:
水平分解:
-
水平分解是将一张表(关系表)的行拆分到多个新的表中(或相同结构的多个数据库中),每个新表都包含原始表的完整结构。拆分通常基于某个列的值范围、哈希值或列表值。
- 利:
- 方便事务使用最经常使用的数据
- 如果若干个事务使用的数据不相交,可以让这些事务存取数据
- 弊:
- 跨分区查询困难
- 利:
聚簇:
-
一种物理数据组织方式,决定数据行在磁盘上的实际存储顺序。
-
如果一个表是聚簇的,那么具有相似聚簇键值的行将被物理地存储在一起。
-
使用
CLUSTERED INDEX
建立
索引:
1 | CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name |
#第十章
事务的定义要知道
故障恢复过程中,日志、检查点等都需要知道,数据库镜像不是重点
恢复策略不作要求
事务:
-
事务是数据库管理系统(DBMS)执行的一个或一组操作,视为一个单一的、逻辑的工作单元。
-
事务是原子性的,要么全部成功执行并持久化到数据库,要么全部失败并回滚。
-
特性:ACID 原则
- 原子性 (Atomicity): 事务是“全有或全无”的。事务中的所有操作要么全部成功,要么全部失败并撤销。即使发生系统故障,已提交的事务也不会丢失。
- 一致性 (Consistency): 事务执行前后,数据库必须保持一致性状态。这意味着事务必须遵守所有预定义的规则、完整性约束(如主键、外键、检查约束)和业务逻辑。
- 隔离性 (Isolation): 多个并发执行的事务之间互不干扰。一个事务的中间状态对其他事务是不可见的,就好像它们是串行执行的一样。这防止了脏读、不可重复读和幻读等并发问题。
- 持久性 (Durability): 一旦事务成功提交,其对数据库所做的更改是永久性的,即使发生系统崩溃或电源故障,这些更改也不会丢失。数据库管理系统会确保这些更改被安全地记录下来。
故障:
-
事务故障:事务没有达到预期终点(COMMIT 或 ROLLBACK)
- 需要撤销事务已经做出的任何修改(因为它确实未完成)
-
系统故障:系统停止运转
- 需要撤销未完成事务、重做已提交(因为可能在缓存中,未写回磁盘)事务
-
介质故障:硬盘炸了
- 备份,否则没救了
日志:
-
一个连续的记录序列,详细记录了数据库中发生的所有事务操作(包括数据的修改、插入、删除,以及事务的开始、提交、回滚等)。
-
内容包含:
- 事务 ID
- 操作类型(如 INSERT, UPDATE, DELETE)
- 被修改的数据项标识(如表名、行 ID)
- 旧值 (Before Image): 数据项被修改前的值(用于回滚事务)
- 新值 (After Image): 数据项被修改后的新值(用于重做已提交事务)
- 事务的开始、提交、回滚记录
为什么重做已提交任务是可行的?
因为赋值操作是幂等的,多做一次并不会改变结果。同理,这就是为什么日志是赋值而非修改
检查点:
-
将内存中所有已提交但尚未写入磁盘的数据(即脏页)强制写入磁盘,并记录下日志文件的当前位置。简单来说,它为恢复过程创建了一个一致的起点。
-
操作过程:
- 暂停或限制新的数据库活动。
- 将所有内存中的脏页(已修改但未写入磁盘的数据页)写入磁盘。
- 将所有活跃事务的日志记录强制写入磁盘。
- 在日志文件中写入一个特殊的检查点记录,其中包含活跃事务列表和日志起始位置等信息。
- 恢复正常数据库活动。
#第十一章
并发控制为什么会出问题?如何解决不一致性?——主要是封锁,两种锁,写读锁之间如何影响,几个协议相互关系等
事务调度:基本概念,串行、冲突可串行化包括后面的几个锁等都需要知道
重点在讨论理解性和技术的部分,概念性的东西不是重点。
隔离级别:
-
读未提交:可以读未提交的内容,解决丢失修改
-
读已提交:只能读已提交的内容,解决脏读
-
可重复读:读过的内容别人不能写(S 锁),解决不可重复读
-
串行化:两阶段封锁,解决幻读
为什么读未提交解决了丢失修改?因为这四个隔离级别都会给写加 X 锁
两种基本锁类型:
-
排他锁 (Exclusive Lock, X-Lock / 写锁)
- 用于写操作(INSERT, UPDATE, DELETE)
-
共享锁 (Shared Lock, S-Lock / 读锁)
- 用途: 用于读操作(SELECT)
协议:
-
一级封锁协议
- 事务在修改数据之前必须加 X-Lock,事务结束后释放 X-Lock。
-
二级封锁协议
- 在一级封锁协议的基础上,事务在读取数据之前必须加 S-Lock,读完即可释放 S-Lock。修改数据前加 X-Lock,事务结束后释放 X-Lock。
-
三级封锁协议
- 在二级封锁协议的基础上,要求 S-Lock 也必须在事务结束时才释放(而非读完释放)。
冲突可串行化 (Conflict Serializability)
-
冲突操作: 指在不同事务中,针对同一数据项,且至少有一个操作是写操作的两个操作。
- R(X) 与 W(X) 冲突 (读写冲突)
- W(X) 与 R(X) 冲突 (写读冲突)
- W(X) 与 W(X) 冲突 (写写冲突)
-
冲突等价: 如果一个并发调度通过交换非冲突操作的顺序,可以转换为一个串行调度,那么这个并发调度就是冲突可串行化的。
-
可串行化:执行结果与这些事务的某个串行调度的执行结果相同(是“冲突可串行化”的超集)。
-
意义: 冲突可串行化是判断并发调度是否正确(即是否能避免所有并发异常)的重要标准之一。如果一个调度是冲突可串行化的,那么它保证是正确的。
-
与 2PL 的关系: 所有遵守两阶段封锁协议(2PL)的调度都是冲突可串行化的。 这也是 2PL 如此重要的原因。它提供了一个实际可行的机制来生成正确的并发调度。
两段锁协议保证可串行化调度,但是有可能死锁。
意向锁是用来减少“加锁时查询子节点是否有锁”的开销的。
SIX 是 S + IX,所以共存性是两个锁相交