基本概念
-
数据独立性:
物理独立性:应用程序与数据库中数据的物理存储相对独立。
逻辑独立性:应用程序与数据库的逻辑结构独立。
-
两类数据模型:
概念模型:
码:唯一标识实体的属性称为码。(学号之于学生)
实体型:用实习及其属性名集合来抽象刻画同类实体。
实体集:同一类型实体的集合。
逻辑模型和物理模型:
(数据模型):分为层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化数据模型。
-
关系模型的数据结构:
关系:一个关系对应一张表。
码(码键):表中可唯一确定一个元组的某个属性组(学号)。
域:一组具有相同数据类型的值的集合,属性的取值范围来自某个域。(学生年龄的取值范围)
分量:元组中的一个属性值。(学生A的年龄)
关系模式:对关系的描述。关系名(属性1,属性2,...) -> 学生(学号,姓名,性别,...)
关系模式要求关系必须是规范化的。
关系的每一个分量必须是一个不可分割的数据项。
-
数据库系统的三级模式结构与二级映像功能
关系数据库
关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。
-
关系
基数:一个域允许的不同取值个数成为这个域的基数。
笛卡尔积(X)
关系:D1 X D2 X ... X Dn的子集叫做在域D1,D2,...,Dn上的关系,表示为R(D1,D2,...,Dn),R为关系名,n是关系的目或度。
候选码:某一属性组的值能唯一标识一个元组,而其子集不能。
若有多个候选码,则选定其中一个为主码。
候选码的各属性成为主属性。(非主属性/非码属性)
全码:关系模式的所有属性是这个关系模式的候选码。
关系模式三类型
- 基本关系(基本表、基表) 真实存在
- 查询表
- 视图表 虚表
-
关系操作
基本操作:选择、投影、并、差、笛卡尔积。
其他:连接、除、交。
-
关系的完整性
- 实体完整性:主属性不可取空置。
- 参照完整性:外码 或者都空或者都等于对应列中值。
- 用户定义完整性。
1和2是自动支持。
-
关系代数
象集
选择:σ
投影:
分为两步:(1)选择出指定的属性,形成一个可能含有重复行的表。
(2)删除重复行,形成新的关系。
连接:⋈ 自然连接、等值连接、外连接、左外连接、右外连接
除:÷
数据库安全性
-
自主存取控制(DAC)
用户对不同数据库对象有不同的存取权限,不同的用户对同意对象也有不同权限,用户可将其拥有的存取权限转授给其他用户(REVOKE,GRANT)。
-
强制存取控制(MAC)
每个数据库对象被标以一定密级,每个用户也被授予一个级别的许可证。对于任意对象,只有具有合法许可证的用户才可进行存取。强制存取控制相对比价严格。
规则:
(1):仅当主体的许可证级别大于等于客体的密级时,该主体才能读相应的客体。
(2):仅当主体的许可证级别小于等于客体的密级时,该主体才能写相应的客体。
注意理解此规则。只有低级别的可以写,高级别的可以看。避免数据从高密级流向低密级,造成数据的泄露。
-
视图机制(VIEW)
-
审计(AUDIT,NOAUDIT)
-
数据加密
-
其他安全性保护
推理控制:避免用户利用其能访问的数据推知更高密级的数据。
隐蔽信道:攻击者根据UNIQUE等条件尝试插入不同值,插入失败时即证明找到原数据。
数据隐私
数据库完整性
-
实体完整性
主键
-
参照完整性
外键
-
用户定义完整性
属性上的约束条件:不允许空值(NOT NULL),列值唯一(UNIQUE),CHECK语句检查条件
元组上的约束条件
完整性约束命名子句(CONSTRAINT)
域中的完整性限制(DOMAIN)
断言(ASSERTION)
触发器(TRIGGER)
关系数据理论
-
规范化
好的模式应当不会发生插入异常、删除异常和更新异常,数据冗余尽可能少。
函数依赖:X函数确定Y 或 Y函数依赖于X,记作:X->Y。
相关概念:非平凡的函数依赖、平凡的函数依赖、决定因素、完全函数依赖、部分函数依赖、传递函数依赖。
完全函数依赖:X->Y,且对于X的任意一个真子集X',都无法满足X'->Y
码:候选码、超码、主码、全码。
主属性:包含在任何一个候选码的属性(非主属性或非码属性)。
全码:整个属性组都是码。
候选码是最小的超码。
-
范式
1NF:每一个分量必须是不可分的数据项。
2NF:属于1NF,且每一个非主属性完全函数依赖于任何一个候选码。
若一个关系不属于2NF,会产生插入异常、删除异常、修改复杂。
3NF:属于1NF,且每一个非主属性既不传递依赖于码,也不部分依赖于码。R如果属于3NF,则必有R属于2NF。
若一个关系模式不属于3NF,就会产生与2NF相似的问题。
BCNF:属于1NF,且每一个决定因素都包含码。
一个满足BCNF的关系模式有:
- 所有分主属性对每一个码都是完全函数依赖。
- 没有主属性对每一个不包含它的码也是完全函数依赖。
- 没有任何属性完全依赖于非码的任何一组属性。
4NF:限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
5NF:
-
Armstrong公理系统
关系查询处理和查询优化
-
关系数据库系统的查询处理
步骤:查询分析、查询检查、查询优化、查询执行。
选择操作实现算法:
- 全表扫描算法
- 索引扫描算法(B+树索引、hash索引)
连接操作实现算法:
- 嵌套循环算法
- 排序-合并算法:先排序再一遍扫描。
- 索引连接算法:先建立A表索引,再扫描B表逐一连接。
- hash join算法:处理等值连接的算法。划分阶段:为小表建立hash索引。试探(连接)阶段:大表hash散列逐一寻找。
-
关系数据库系统的查询优化
查询总代价=I/O代价+CPU代价+内存代价+通讯代价。计算查询代价时一般用处理读写的块数作为衡量的单位。
-
代数优化
关系代数表达式等价变换规则
- 连接、笛卡尔积 交换律、结合律
- 投影的串联定律
- 选择的串联定律
- 选择与投影操作的交换律
- 选择与笛卡尔积的交换律
- 选择与并的分配率
- 选择与差运算的分配率
- 选择对自然连接的分配率
- 投影与笛卡尔积的分配率
- 投影与笛卡尔积的分配率
- 投影与并的分配率
查询树的启发式优化
- 选择运算尽可能先做
- 把投影运算和选择运算同时进行
- 把投影同其前或后的双目运算结合起来
- 把某些选择同它前面要执行的笛卡尔积结合起来成为一个连接运算
- 找出公共子表达式
-
物理优化
基于规则的启发式优化:大多数情况都适用,但不是在每种情况下都是最好的规则。
基于代价估算的优化:使用优化器估算不同执行策略的代价,选择代价最小的计划。
两者结合的优化方法
连接操作的启发式规则:选择块数小的表做外表。
数据库恢复技术
-
事务
事务:用户定义的一个数据库操作序列,是一个不可分割的工作单位。
COMMIT表示提交,ROLLBACK表示回滚,即撤销。
事务的ACID特性:
- 原子性(Atomicity):事务是数据库的逻辑工作单位,其中包含的诸操作要么都做要么都不做。
- 一致性(Consistency):数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰。
- 持久性(Durability):事务一旦提交,对数据库中数据的改变是永久性的。
-
故障种类
事务内部故障:非预期、不能由应用程序处理。 恢复操作:事务撤销(UNDO)。
系统故障(软故障):恢复操作:重做(REDO)
介质故障(硬故障)
计算机病毒
恢复原理:冗余(数据转储和登记日志文件)。
-
恢复的实现技术
数据转储:定期将整个数据库复制到其他存储介质上,备用数据称为后备副本或后援副本。重装后备副本只能将数据库恢复到转时的状态,想要恢复到故障发生时的状态,必须重新运行自转储之后的所有更新事务。静态转储、动态转储、海量转储、增量转储。
登记日志文件:两条原则:1.登记的次序严格按照并发事务执行的时间次序。2.必须先写日志文件,后写数据库。
-
恢复策略
事务故障的恢复:利用日志文件撤销此事务已对数据库进行的修改。
系统故障的恢复:撤销故障发生时未完成的事务,重做已完成的事务。
介质故障的恢复:重装数据库,重做已完成事务。
具有检查点的恢复技术
检查点记录内容包括:建立检查点时刻所有正在执行的事务清单、这些事务最近一个日志记录的地址。
使用检查点可以改善恢复效率。
使用检查点恢复时根据事物完成时间与检查点设定时间和系统故障时间将事物分为不需重做、重做、撤销三类。
-
数据库镜像
并发控制
并发操作带来的数据不一致性包括:丢失数据、不可重复读、读脏数据。
并发控制主要技术:封锁、时间戳、乐观控制方法、多版本并发控制(MVCC)等。
-
封锁
排他锁(写锁、X锁):事务T对数据对象加X锁,则只允许T读取和修改A,其他事务不可再对A加任何类型的锁。
共享锁(读锁、S锁):事务T对数据对象加S锁,则T可以读取A但不能修改A,其他事务只能对A再加S锁而不能加X锁,直至T释放A上的S锁为止。
-
封锁协议
一级封锁协议:事务在修改数据之前必须先对其加X锁,直到结束才释放。不能保证可重复读、不能保证不读脏数据。
二级封锁协议:在一级封锁协议基础上增加事务在读取数据之前必须先对其加S锁,读完后即可释放S锁。不能保证可重复读。
三级封锁协议:在一级封锁协议基础上增加事务在读取数据之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议主要区别在于什么操作需要申请封锁以及何时解锁。
活锁:类比OS中饥饿至饿死。避免:FCFS。
死锁:类比OS中死锁。死锁的预防:一次封锁法(一次申请完)、顺序封锁法(规定封锁顺序)。
死锁诊断解除:超时法、等待图法。
-
并发调度的可串行性
冲突可串行化调度是可串行化调度的充分条件,不是必要条件。
-
两段锁协议
(获得封锁,扩展阶段)在对任何数据进行读写操作之前,先要申请并获得对该数据的封锁;
(释放封锁,收缩阶段)在释放一个封锁之后,事务不再申请和获得任何其他的封锁。
并发执行的所有事务均遵循两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。
事务遵守两段锁协议是可串行化调度的充分条件,不是必要条件。
-
封锁的粒度
封锁的粒度与系统的并发度和并发控制的开销密切相关。粒度大,数据库能封锁的数据单元少,并发度小,系统开销小。
多粒度封锁:允许多粒度树中的每个结点被独立地加锁。对一个结点加锁意味着这个结点的所有子孙结点也被加同样类型的锁。
显示封锁:自己被加锁了。
隐式封锁:他爸爸/爷爷被加锁了。
为避免加锁时查询子节点加锁状态而大量遍历子节点引入意向锁,即对一结点加锁时,必须先对它的祖先结点加意向锁。
意向共享锁(IS锁):对一个数据对象加IS锁,表示它的子孙结点拟(意向)加S锁。
意向排他锁(IX锁):对一个数据对象加IX锁,表示它的子孙结点拟(意向)加X锁。
共享意向排他锁(SIX锁):对一个数据对象加SIX锁,表示对它加S锁,再加IX锁。