一.关系数据理论
1.函数依赖
X → Y:X确定Y (Y函数依赖于X)
1.平凡函数依赖
在关系模式R(U)中,若X→Y,且Y ⊆ X,则称X→Y是平凡的函数依赖。
例:(Sno , Cno) → Sno (Sno , Cno) → Cno
2.非平凡函数依赖
在关系模式R(U)中,若X→Y,但Y ⊄ X,则称X→Y是非平凡的函数依赖。
例:(Sno , Cno) → Grade
3.完全函数依赖
在关系模式R(U)中,若X→Y,且对于X的任何一个真子集X',都有X'!→Y,则称Y完全函数依赖于X,记作X Y。
例:Sno !→ Grade , Cno !→ Grade
故 (Sno,Cno) Grade
4.部分函数依赖
在关系模式R(U)中,若X→Y,且对于X的任何一个真子集X',有X'→Y,则称Y部分函数依赖于X,记作X Y。
5.传递函数依赖
在关系模式R(U)中,若X→Y,Y→Z,且Y ⊄ X,Y !→X,则称Z传递依赖于X。
注:若Y→X,即X←→Y,则Z直接依赖于X。
例:在关系Std(Sno , Sdept , Sloc)中:
Sno → Sdept、Sdept → Sloc 则Sloc传递函数依赖于Sno
2.范式
范式是符合某一种级别的关系模式集合。
1NF
若关系模式R的所有属性都是不可分的基本数据项,则R ∈ 1NF。 (原子性)
2NF
若R ∈ 1NF,且每一个非主属性完全依赖于任何一个候选码,则R ∈ 2NF。
3NF
若R ∈ 2NF,且关系模式R(U,F)中不存在这样的主码X,属性组Y及非主属性Z(Z ⊄ Y)使得:X→Y,Y !→X,Y→Z成立,则称R(U,F) ∈ 3NF。 (可以通俗理解为不存在传递依赖)
注意点:
若R ∈ 3NF,则R的每一个非主属性既不部分依赖于候选码也不传递函数依赖于候选码。
BCNF
设有关系模式R(U,F),若对于R的每个函数依赖X→Y,若Y ⊄ X,则X是候选码(非候选码真子集),那么此关系模式R ∈ BCNF。
区分几种范式的方法
1NF:满足原子性和唯一性(属性唯一,元组唯一)
2NF:1NF+没有非主属性对任一候选码的部分函数依赖
3NF:2NF+没有非主属性对任一候选码的传递函数依赖
BCNF:3NF+没有主属性对任一候选码的部分和传递函数依赖
若关系模式R ∈ 3NF,且R只有一个候选码,则R必属于BCNF
3.闭包
设F为R关系模式上的函数依赖集,被F所逻辑蕴含的全体构成的集合,称为F的闭包,记做F⁺。
4.最小函数依赖集
通俗定义:
F中任意函数依赖的右边只有一个属性。
F中不存在这样的函数依赖:某一函数依赖删除后所得函数依赖集与原函数依赖集等价。
F中不存在这样的函数依赖:设存在函数依赖AB→Y,对左部进行化简得A→Y或B→Y,化简前后的函数依赖集等价。
5.候选码的计算
6.模式分解
模式分解要尽量保持函数依赖和无损连接性。
此章算法题详见https://blog.csdn.net/OkizukiNanami/article/details/129220671
二.数据库设计
1.数据库设计过程
1.需求分析
信息要求
处理要求
安全性与完整性要求
数据字典:各类数据描述的集合,是数据分析后的成果,包括数据项、数据结构、数据流、数据存储、处理过程等。
2.概念结构设计
将用户需求抽象为概念模型
特点
能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求。是对现实世界的一个真实模型。
易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库的设计成功的关键。
易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。
易于向关系、网状、层次等各种数据模型转换。
概念结构的设计策略通常有四种:自顶向下。自底向上。逐步扩张。混合策略。
E-R模型
使用E-R图来描述现实世界的概念模型,包括实体、属性、实体之间的联系等。
E-R图提供了表示实体型、属性和联系的方法:
实体型用矩形表示,矩形框内写明实体名。
属性用椭圆形表示,并用无向边将其与相应的实体型连接起来。
联系用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标注上联系的类型(1:1、1:n或m:n)。
E-R图之间的冲突有三类:属性冲突、命名冲突、结构冲突。
3.逻辑结构设计
E-R图转换为关系模式的规则:
一个实体集转换为关系模型中的一个关系,实体的属性就是关系的属性,实体的码就是关系的码,关系的结构是关系模式。
一个1:1联系可以转换为一个独立的关系,也可以与任意一端实体集所对应的关系合并。如果将1:1系转换为一个独立的关系,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,且每个实体的码均是该关系的候选码。如果将1:1联系与某一端实体所对应的关系合并,则需要在被合并关系中增加属性,其新增的属性为联系本身的属性和与联系相关的另一个实体的码。
实体间的1:n联系可以有两种转换方法:一种方法是将联系转换为一个独立的关系,其关系的属性由与该联系相连的各实体的码以及联系本身的属性组成,而该关系的码为n端实体的码;另一种方法是在n端实体集中增加新属性,新属性由联系对应的1端实体的码和联系自身的属性构成,新增属性后原关系的码不变。
一个m:n联系转换为一个独立的关系,与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,新关系的码为两个相连实体码的组合,并且既是主码又是外码。
4.数据库物理设计
数据库系统针对多用户要对同一个关系建立多条存取路径,选取合适的存取方法,来满足多用户的多种软件需求。同时进行物理设计需要评估时间和空间效率。
DBMS常用存取方法:
索引,主要是B+树索引
聚簇方法
HASH方法
5.数据库实施
DDL、DML、DCL等。
6.数据库运行和维护
三.关系查询处理和查询优化
1.关系系统
一个数据库管理系统可定义为关系系统,当且仅当它至少支持:
1.关系数据结构,只有表这种结构。
2.支持选择、投影、连接运算,且不需定义物理存取路径。
2.查询优化
查询处理主要分为四步:查询分析,查询检查,查询优化,查询执行。
1.查询优化的一般准则
选择运算应尽可能先做。
把投影运算和选择运算同时做。
把投影同其前或其后的双目运算结合。
把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算。
找出公共子表达式。
2.优化树
四.数据库恢复技术
1.事务(Transaction)
1.基本概念
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
事务是恢复和并发控制的基本单位。
2.显式定义
BEGIN TRANSACTION
SQL语句1
SQL语句2
......
COMMIT/ROLLBACK
COMMIT
事务正常结束
提交事务的所有操作(读+更新)
事务中对数据库的更新永久生效
ROLLBACK
事务异常终止
回滚事务的所有更新操作到开始前的状态
3.事务特性(ACID)
事务的特性包括原子性、一致性、隔离性、持续性。
原子性
事务的不可分割性。
一致性
一致性:事务执行的结果必须使得数据库从一个一致性状态变到另一个一致性状态。
一致性状态:数据库中只包含成功事务提交的结果。
隔离性
一个事务的执行不能被其他事务干扰。
持续性
事务一旦提交,对数据库中数据的改变是永久性的。
2.数据库故障
故障的种类:事务故障、系统故障、介质故障。
1.事务故障
某事务在运行过程中由于种种原因未运行指正常终止点就夭折了。常见原因包括输入数据有误、运算溢出、违反完整性限制、并行事务死锁等。
事务故障的恢复:
使用撤销事务(UNDO)强行回滚该事务,清除该事务对数据库的所有修改。不需用户干预。
2.系统故障
操作系统或DBMS代码错误、操作员操作失误、硬件错误、突然停电等。
系统故障的恢复:
UNDO撤销故障发生时未完成的事务。
REDO重做已完成的事务。
系统故障的恢复由系统重启时自动完成,不需用户干预。
3.介质故障
硬件故障使得存储在外存中的数据部分丢失或全部丢失。磁盘损坏、磁场干扰等。
介质故障的恢复:
思想:使用日志文件+动态转储后备副本。动态转储数据库时同时转储同一时间点的日志文件,利用这些日志文件副本进一步恢复事务,避免重新运行事务程序。
重装数据库,使数据库恢复到一致性状态。(静态转储装入后处于一致性状态,动态转储的副本还需利用同时装入的日志文件副本,利用REDO+UNDO才能恢复到一致性状态)
重做已完成的事务(REDO)。
恢复操作的基本原理:冗余
3.恢复的实现技术
建立冗余数据的方法:数据转储、日志文件。
1.数据转储
数据库恢复采用的基本技术。转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。
数据转储方法
静态转储与动态转储
海量转储与增量转储
静态转储
在系统无运行事务时进行转储
转储开始时数据库处于一致性状态
转储期间不允许对数据库进行任何存取、修改操作
优点:实现简单
缺点:耗时,转储和事务必须等待对方操作完成
动态转储
转储与事务并发进行
转储期间允许对数据库进行存取和修改
优点:省时,不影响事务进行
缺点:不能保证副本中数据的正确有效
海量转储
每次转储整个数据库
增量转储
只转储上次转储后更新的数据
2.日志文件
日志文件是用来记录事务对数据库的更新操作的文件。
日志文件的格式
以记录为单位的日志文件
以数据块为单位的日志文件
登记日志文件需要遵循以下原则:
登记次序严格按照并行事务执行的时间顺序
先写日志文件,后写数据库。写日志文件:把表示修改的记录添加到日志文件。写数据库:把对数据的修改写到数据库中。
3.具有检查点的恢复技术
在日志文件中增加检查点记录,增加重新开始文件,动态维护日志,降低搜索日志耗费的时间。
五.并发控制
1.并发控制机制的任务
对并发操作进行正确调度
保证事务的隔离性
保证数据库的一致性
2.并发操作带来的数据不一致性
丢失修改
T1和T2读入数据并修改,T2的修改破坏了T1的修改,导致T1的修改丢失。
不可重复读
T1读取数据后,T2对其进行了修改,当T1再次读取时数据与前一次不同(或T2删除了一些记录、增加了一些记录,这两种又称为幻影现象)。
读脏数据
T2读入了T1修改后的数据,但T1修改的操作被撤销,导致T2读的数据与数据库中的数据不同。
3.封锁
封锁是指事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁。
DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。通常使用两种封锁类型:
排它锁(eXclusive lock,简记为X锁)
事务对数据加X锁,别的事务不能再加锁。
共享锁(Share lock,简记为S锁)
事务对数据加S锁,别的事务可以加S锁,但不能加X锁。
1.封锁协议
一级封锁协议:事务修改数据前必须加X锁,到事务结束时才释放。可保证防止丢失修改,不保证可重复读和读脏数据(读不加锁)。
二级封锁协议:在一级的基础上,事务在读取数据R前必须先加S锁,读完后即可释放。可防止丢失修改和读脏数据。由于读完数据后即可释放S锁,故不保证可重复读。
三级封锁协议:在一级的基础上,事务在读取数据R前必须先加S锁,直到事务结束才释放。可防止丢失修改、读脏数据和不可重复读。
2.活锁和死锁
活锁:某事务一直等待资源,用先来先服务解决活锁问题。
死锁:相互等待对方的资源。
死锁预防:一次封锁法、顺序封锁法。 死锁诊断解除:超时法、等待图法。
3.封锁的粒度
X锁和S锁都是加在某一个数据对象上的。
封锁的对象:逻辑单元,物理单元。
封锁的粒度越大,系统能够被封锁的对象就越少,并发度就越小,系统开销越小。
选择封锁粒度的原则:
综合考虑封锁机构、并发度、系统开销。
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位。
需要处理大量元组的用户事务:以关系为封锁单位。
只处理少量元组的用户事务:以元组为封锁单位。
多粒度封锁:使用多粒度树,对元组、属性等多个深度结点分别封锁。
意向锁:如果对一个节点加意向锁,则说明该节点的下层节点正在被加锁。
对任一节点加基本锁,必须先对它的上层节点加意向锁。
4.并发调度的可串行性
1.可串行化调度
几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。这种并行调度策略称为可串行化的调度。可串行化是并行事务正确性的唯一准则,这样的调度就是正确调度。
2.保证并发操作正确性的方法
封锁方法:两段锁(2PL)协议
时标方法
乐观方法
两端锁协议:在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁。再释放一个封锁之后,事务不得再申请和获得其他任何封锁。