什么是数据管理:对数据进行分类、组织、编码、存储、检索和维护。
数据管理技术的发展动力:应用需求和计算机软硬件的发展
发展三阶段:
| 人工管理 | 文件系统 | 数据库系统 | |
|---|---|---|---|
| 谁管理数据 | 程序员 | OS提供存取方法 | 系统集中管理 |
| 面向谁 | 特定应用 | 基本上是特定用户 | 面向系统 |
| 共享性 | 无 | 很弱 | 充分共享 |
| 数据独立性 | 无 | 一定的物理独立性 | 较高的独立性 |
文件系统和数据库系统的本质区别:
物理独立性
逻辑独立性
狭义
广义
描述事物的符号记录称为数据。
一般将对数据的静态特征和动态特征的描述称为数据模型三要素,即数据的基本结构、数据的约束条件和定义在数据上的操作。
数据模型 (data model) 也是一种模型,它是对现实世界数据特征的抽象。
在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据和信息
把现实世界中的客观对象抽象为概念模型
把概念模型转换为某一DBMS支持的组织模型
ER模型是常用的概念层数据模型(除此之外还有面向对象的模型)
实体(Entity):客观存在并可相互区别的事物称为实体,可以是具体的人、事、物或抽象的概念
属性(Attribute):实体所具有的特征或性质、一个实体可以由若干个属性来刻画
主码(Primary key):唯一标识实体的属性集称为码。
联系(Relationship):现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。实体内部的联系通常是指组成实体的各属性之间的联系,实体之间的联系通常是指不同实体集之间的联系。
联系包括一对一联系、一对多联系、多对多联系。
实体:矩形,矩形内写实体名称
属性:用椭圆形表示,椭圆形框内写明属性名并用无向边将其与相应的实体连接起来
码:属性名加下划线
多值属性:用双线椭圆形表示,椭圆形框内写明属性名并用无向边将其与相应的实体连接起来。
导出属性:用虚线椭圆形表示,椭圆形框内写明属性名并用无向边将其与相应的实体连接起来。
联系:用菱形表示。
三级模式和两级映像
外模式也称子模式(subschema)或用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
一个数据库可以有多个外模式。但一个应用程序只能使用一个外模式。
1 | 简单理解为数据库的视图,或者视图的集合,view,操作包括: |
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。使用DDL来定义模式。
1 | 简单理解为数据库的表,table,操作包括: |
内模式也称存储模式(storageschema),一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
当模式改变时(例如增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式的映像作相应改变,可以使外模式保持不变。
应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
当数据库的存储结构改变时(例如选用了另一种存储结构),由数据库管理员对模式/内模式映像作相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性。
分为分为两大类:
选择(限制)
从行的角度进行运算。在关系R中选择满足给定条件的诸元组
F:选择条件,是一个逻辑表达式
$$
\sigma_{\mathrm{F}}(R)={t|t{\in}R\wedge F(t){=}`\text{真}}
$$
投影
从R中选择出若干属性列组成新的关系
$$
\Pi_{A}(R)={t[A]\mid t\in\mathbb{R}}
$$
A:R中的属性列
连接
从两个关系的笛卡尔积中选属性间满足一定条件的元组
$$
R\operatorname*{\longrightarrow}{{A0B}}{\mathcal S}={\begin{array}{cc}{\widehat{t_{r}t_{s}}}\\end{array}|t_{r}\in R\wedge t_{s}\in{\mathcal S}\wedge t{r}[A]\theta t_{_s}[B]}
$$
连接运算就是从R和S的广义笛卡尔积RXS中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系0的元组
除
给定关系R(X,Y)和S(Y,Z),其中X、Y、Z为属性组。
R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:
$$
\mathbf{R}\div\mathbf{S}={\mathbf{t}{\mathrm{r}}[\mathbf{X}]\mid\mathbf{t}{\mathrm{r}}\in\mathbf{R}\wedge\mathbf{\pi}{\mathrm{Y}}(\mathbf{S})\subseteq\mathbf{Y}{\mathrm{x}}}
$$
这里的关系模式可以理解为数据库表的列。
如果有关系模式R(A1,A2,…,An),X和Y为{A1,A2,…An} 的子集,则对于关系R中的任意一个X值,都只有一个Y值与之对应,则称X函数决定Y,或Y函数依赖于X,表示为:
$$
X \to Y
$$
设有关系模式R(A1,A2,..,An),X和Y均为{A1,A2,…,An}的子集,r是R的任一具体关系t1、t2是r中的任意两个元组; 如果由t1[x]=t2[x]可推导出t1[Y]=t2[Y],则称X函数决定Y,或Y函数依赖于X,记为X→Y。
$$
X \to Y
$$
设有关系模式R(A1,A2,..,An),X和Y均为{A1,A2,…,An}的子集,则有以下结论:
如果$X\to Y$,且对于X的一个任意真子集$X’$,都有$X’\nrightarrow Y$成立,则称Y完全函数依赖于X(没有任何其他属性能够决定这些属性的值。):
$$
X \xrightarrow{f} Y
$$
如果$X\to Y$,且对于X的一个任意真子集$X’$,有$X’\rightarrow Y$成立,则称Y部分函数依赖于X(X中任意一个属性不能单独决定Y):
$$
X \xrightarrow{p} Y
$$
如果$X\to Y$,非平凡函数依赖,且:$Y\nrightarrow X$,$Y\to Z$则称Z传递函数依赖于X,记作:
$$
X \xrightarrow{传递} Y
$$
通过分解关系模式消除不合适的数据依赖。
候选码:设K为R(U,F)中的属性或属性组,若K完全决定U,则K为R的候选码。
主码:关系R(U, F)中可能有多个候选码:则选其中一个作为主码。
全码:候选码为整个属性组。
主属性:包含在任一候选码中的属性称为主属性,不包含在任一候选码中的属性称为非主属性
1 | 主码是**集合**,主属性是集合中的**元素** |
外码 :关系之间建立关联的属性(组)。关系模式R中属性(组)X是另一个关系模式S的候选码(通常为主码),则称 X 为R的外码。
数据库范式是一组规范化(Normalization)的原则,用于设计关系型数据库结构,以减少数据冗余并确保数据的一致性和完整性。
分为第一范式 (1NF)、第二范式(2NF)、第三范式(3NF)、扩展的第三范式(BCNF)
总览:
$$
1NF \subset 2NF \subset 3NF \subset BCNF
$$
且
$$
1NF \xrightarrow{消除非主属性对码的部分函数依赖} 2NF \xrightarrow{消除非主属性对码的传递函数依赖} 3NF \xrightarrow{消除主属性对码的部分和传递依赖} BCNF
$$
某一关系模式R为第n范式,可简记为$R\in NF$
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。
第一范式(1NF):所有属性都不可分的关系。
第二范式 (2NF): 如果$R(U,F) \in 1NF$,并且R中的每个非主属性都完全函数依赖于码,则$R(U,F)\in 2NF$
分解方法:
1 | 对 S-L-C(Sno, Sname, Ssex, Sdept, SLOC, Cno, Grade) |
目前存在的问题:
数据冗余:有多少个学生就有多少个重复的Sdept和SLOC
插入异常:当新建一个系时,若还没有招收学生,则无法插入;
第三范式(3NF):如果$R(U,F)\in 2NF$并且所有非主属性都不传递依赖于码则$R(U,F)\in 3NF$
S-L(Sno, Sname, Ssex, Sdept, Sloc)
因为 Sno->Sdept, Sdept->SLOC, 所以Sno -传递-> SLOC,S-L不是3NF
分解方法:
1 | S-L(<u>Sno</u>, Sname, Ssex, Sdept, Sloc) |
不能说规范化程度越高的关系模式就越好。
关系模式$R(U, F)\in 3NF$,若$X\to Y$且$Y \nsubseteq X$ 时X必含有码,则$R(U, F)\in BCNF$
等价于: 每一个决定属性因素都包含候选码。
如果$R\in 3NF$且R只有一个候选码,则
事务是用户定义的数据操作系列,这些操作作为一个完整的工作单元,一个事务内的所有语句被作为一个整体,要么全部执行,要么全部不执行。
一个事务可以是一组SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。
事务的ACID特性可能遭到破坏的因素有两种:
隐式事务:又称自动提交事务,每条数据操作语句都自动成为一个事务。
显式事务:有显式的开始和结束标记的事务。【ISO事务处理模型、T-SQL事务处理模型】
ISO事务处理模型
明尾暗头:事务的开头是隐含的,事务的结束有明确标记。
事务结束符
COMMIT:事务成功结束符
ROLLBACK:事务失败结束符
事务起始/终止位置:程序的首条SQL语句或事务结束符后的语句;在程序正常结束处或COMMIT语句处成功终止;在程序出错处或ROLLBACK处失败终止。
1 | UPDATE 支付表 |
T-SQL事务处理模型
每个事务都有显式的开始和结束标记。
事务的开始标记是:BEGIN TRANSACTION | TRAN
事务的结束标记为:
1 | COMMIT [TRANSACTION | TRAN ] |
1 | BEGIN TRANSACTION |
系统中,可能同时运行着多个事务,而事务的运行需要时间 ,并且事务中的操作是在一
定的数据上进行的。当系统中同时有多个事务在运行时,特别是当这些事务是对同一段数据进行操作时,彼此之间就有可能产生相互干扰的情况。
每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。
问题:不能充分利用系统资源,发挥数据库共享资源的特点。
在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行。
单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率。
多处理机系统中,每个处理机可以运行一个事务。多个处理机可以同时运行多个事务,实
现多个事务真正的并行运行。
1 | 飞机订票系统中的一个活动序列: |
问题:
并发控制是衡量 DBMS 性能的重要标志之一。
并发控制机制的任务
丢失修改(LostUpdate)
读“脏”数据(DirtyRead)
事务 T1对数据进行了更新但没有提交,事务T2读到了事务T1更新后(未提交)的数据。如果事务T1进行了回滚,那么刚刚事务T2看到的数据就是脏数据。事务T2 进行了脏读。
示例:甲给乙转账500,但是甲还没有提交,但是此时乙查询自己账户多了500。然后甲发现转错人了,回滚了转账。然后乙多出的500就没了。在这个过程中乙查到了没有提交的数据(多出的500),这就是脏读。
不可重复读(Non-repeatableRead)
不可重复读:事务A读取数据库中的数据后,事务B更新了数据,当A再次读取数据时,就会发现数据已经发生了改变,这就是不可重复读取。不可重复读取所导致的结果就是一个事务前后两次读取的数据不相同。重点在于update
示例:甲查询自己银行余额为1万,乙这个时候用甲的账号取走了3000,甲再一次查询余额,变成了7000。对甲而言两次结果不一致就是不可重复读。
产生“幽灵”数据(幻读)
幻读:如果事务T1基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是幻读。重点在于insert
示例:甲查询自己银行明细中与乙的资金往来,之后乙向甲转了一笔账,甲再次查询发现比之前的查询多了一条新的记录,这就是幻读。
控制目标:事务运行过程中尽可能隔离事务外操作对本事务数据环境的影响,保证操作的正确性和一致性
并发控制的主要技术——加锁(Locking)
X锁(写锁):若事务T对数据对象A加上X锁,则允许事务T读取和修改A,其它任何事务都不能再对A加任何类型的锁进行任何操作,直到事务T释放X锁,保证其他事务在事务T释放X锁之前不能再读取和修改数据。
S锁(读锁):若事务T对数据对象A加上S锁,则事务T只能读A,但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到事务T释放A上的S锁为止。保证其他事务可以读数据,但是在事务T释放S锁前不能对数据做任何修改。
在运用X锁和S锁对数据对象进行加锁时,还需要约定一些规则,如何时申请X锁或S锁、持锁时间、何时释放锁等。称这些规则为封锁协议或加锁协议。
规则不同,封锁协议不同,达到的系统一致性级别不同。
| 封锁协议 | X锁 | S锁 | 不丢失修改 | 不脏读 | 可重复读 |
|---|---|---|---|---|---|
| 一级 | 全程加锁 | 不加 | √ | ||
| 二级 | 全程加锁 | 事务开始加锁,读完释放 | √ | √ | |
| 三级 | 全程加锁 | 事务全程加锁 | √ | √ | √ |
规定:对事务T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)时才释放。
效果:可以防止丢失修改。不能防止可重复读和不读“脏”数据。
1 |  |
规定:一级封锁协议加上对事务T对要读取的数据加S锁,读完后即释放S锁。
效果:可以防止丢失修改、防止读“脏”数据,不能防止可重复读数据。
1 |  |
规定:一级封锁协议加上事务T对要读取的数据加S锁,并直到事务结束才释放。
效果:可以防止丢失修改、防止读“脏”数据、防止不可重复读,
1 |  |
1 | 在操作系统中广为采用的预防死锁的策略并**不很适合数据库的特点** |
产生死锁的原因:两个或多个事务都已封锁了数据对象,又都请求对已被其他事务封锁的数据对象加锁,从而出现死等待。
预防死锁的发生就是要破坏产生死锁的条件:一次封锁法、顺序封锁法。
一次封锁法
要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
存在的问题:
顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
优点:实现简单。
缺点
等待图法
用事务等待图动态反映所有事务的等待情况:
事务等待图是一个有向图,每个结点表示正运行的事务,每条边表示事务等待的情况,若T1等待T2,则从T1指向T2划一条有向边,图中存在回路,则表示系统中出现了死锁。
解除死锁:
选择一个处理死锁代价最小的事务,将其撤消; 释放此事务持有的所有锁,使其它事务能继续运行。
可串行化调度:
可串行性:
两段锁协议:指所有事务必须分两个阶段对数据项加锁和解锁。
第一阶段是获得封锁,也称为扩展阶段:
第二阶段是释放封锁,也称为收缩阶段:
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。
两种:数据库本身被破坏或者数据库没有被破坏但数数据不正确。
事务内部故障指非预期的,不能由应用程序处理。例如:运算溢出,违反了某些完整性限制等。
事务故障的恢复:事务故障意味着事务没有达到预期的终点,数据库可能处于不正确状态,因此,要在不影响其它事务运行的情况下,撤销该事务已经做的对数据库的修改,使得该事
务好像根本没有运行一样。
事务故障的恢复操作:撤销事务(UNDO)
系统故障称为软故障,是指造成系统停止运转的任何事件,使得系统要重新启动。 例如突然断电。
带来的问题:
发生系统故障时,事务未完成:强行撤消(UND0)所有未完成事务。
发生系统故障时,事务已提交,但缓冲区中的信息尚未完全写回到磁盘上:重做(REDO)所有已提交的事务。
介质故障(磁盘损坏):装入数据库发生介质故障前某个时刻的数据副本。重做自此时始(副本备份时刻)的所有成功事务,将这些事务已提交的结果重新记入数据库。
病毒:查杀病毒,安装防火墙或者实时监控软件。恢复数据库
恢复操作的基本原理:冗余
利用存储在系统其它地方的冗余数据来重建数据库中已被破坏或不正确的那部分数据
数据的恢复涉及两个关键问题:
数据备份是指定期或不定期地对数据库数据进行复制。备份的介质可以用磁盘。
备份数据(数据转储)
要考虑两个因素:
通常情况下,数据库可以每周备份一次,事务日志可以每日备份一次。
对于一些重要的联机事务处理数据库,可以每日备份,事务日志则每隔数小时备份一次。
数据转储:转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用的数据称为后备副本或后援副本。
如何使用:数据库遭到破坏后可以将后备副本重新装入;重装后备副本只能将数据库恢复到转储时的状态。
备份方法:
==静态转储==:在系统中无运行事务时进行的转储操作,转储期间不允许对数据库的任何存取、修改活动。得到的是数据一致性的副本 。实现简单但降低了数据库的可用性。
==动态转储==:转储操作与用户事务并发进行,允许对数据库进行存取或修改。不会影响事务的运行,但不能保证副本中的数据正确有效。
==海量转储==:每次转储全部数据库。
==增量转储==:只转储上次转储后更新过的数据。
海量转储与增量转储比较:
日志文件(log):用来记录事务对数据库的更新操作的文件。
日志文件的格式
以记录为单位的日志文件(日志记录的组成):
以数据块为单位的日志文件的内容:
登记的次序严格按并行事务执行的时间次序
必须先写日志文件,后写数据库:
恢复数据库是指将数据库从错误描述状态恢复到正确的描述状态(最近的正确时刻)的过程。
事务故障的恢复
事务故障:事务在运行至正常终止点前被终止。
恢复方法:利用日志文件撤消此事务已对数据库进行的修改。事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预。
步骤:
系统故障的恢复
系统故障造成数据库不一致状态的原因:
恢复方法:
系统故障的恢复由系统在重新启动时自动完成。
介质故障的恢复
介质故障的恢复需要DBA介入。
具体的恢复操作仍由DBMS完成。
利用备份技术
定期备份; 利用备份文件将数据库恢复到备份时刻的状态。
利用事务日志
利用事务日志可以恢复执行不完整的事务;恢复数据库到事务执行前的状态;系统自动完成。
数据库镜像
问题:
解决方案:数据库镜像(Mirror)
DBMS自动把整个数据库或关键数据复制到另一个磁盘上。
DBMS自动保证镜像数据与主数据库的一致性。
当主数据库更新时,DBMS自动把更新后的数据复制过去。
用途:
没有出现故障时:数据库镜像可用于并发操作。
出现介质故障时:
频繁地复制数据自然会降低系统运行效率。只对关键数据和日志文件镜像,而不是对整个数据库进行镜像。
新奥尔良方法:
过程迭代和逐步求精。
基本步骤:
调查处理对象,了解原系统,明确新系统的功能,考虑以后可能的扩充和改变。
自底向上:先定义局部应用的概念结构,然后按一定的规则把它们集成起来,从而得到全局概念模型。
自顶向下:先定义全局概念模型,然后再逐步细化。
由里向外:先定义最重要的核心结构,然后再逐步向外扩展
混合策略:将自顶向下和自底向上结合起来使用。
设计局部E-R模型
概念结构是对现实世界的一种抽象。所谓抽象是对实际的人、物、事和概念进行人为处理,抽取所关心的共同特性,忽略非本质细节,并把这些特性用各种概念准确的加以描述。一般有三种抽象方法:分类、概括、聚集
分类:在相似的个体之间提取共性,建立 “ 类 ” 的概念(集合)
两条准则:
设计全局E-R模型
将局部E-R图集成为全局E-R图,需消除各分E-R图合并时产生的冲突。解决冲突是合并E-R图的主要工作和关键所在。
冲突主要有三类:
优化全局E-R模型
实体个数尽可能少,实体所包含的属性尽可能少,实体间联系无冗余。
逻辑结构设计的步骤:E-R图转化为关系模型,对数据模型进行优化,外模式的设计。
将实体型和实体间的联系转换为关系模式,并确定这些关系模式的属性和码
实体的转换原则:一个实体转换为一个关系模式。实体的属性就是关系的属性,实体的标识符就是关系的码。一个实体转换为一个关系模式、实体的名称对应关系模式的名称、实体的属性对应关系模式的属性、实体的候选码对应关系模式的候选码。
联系的转换原则:
对于实体间的联系有以下不同的情况:
从理论上讲,1:1联系可以与任意一端对应的关系模式合并
但在一些情况下,与不同的关系模式合并效率会大不一样。因此究竟应该与哪端的关系模式合并需要依应用的具体情况而定。
由于连接操作是最费时的操作,所以一般应以尽量减少连接操作为目标。例如,如果经常要查询某个班级的班主任姓名,则将管理联系与教师关系合并更好些。
数据模型优化
注意:并不是规范化程度越高的关系就越优,一般说来,第三范式就足够了
常用分解优化方法:水平分解和垂直分解。
水平分解
以时间、空间、类型等范畴属性取值为条件,满足相同条件的数据行为一个子表。分解的依据一般以范畴属性取值范围划分数据行。这样在操作同表数据时,时空范围相对集中,便于管理。
垂直分解
以非主属性所描述的应用对象生命历程的先后为条件,对应相同历程的属性为一个子表。分解的依据是将非主属性按其数据生成的时间段划分,描述相同时间段的属性划分在一个组中。使操作同表数据时时空范围相对集中,但便于管理。
物理结构设计的步骤:确定数据库的物理结构,对物理结构进行时间和空间效率的评价。
为关系模式选择 存取方法(建立存取路径)设计关系、索引等数据库文件的物理存储结构。
建立索引
一般用户可以通过建立索引的方法来加快数据的查询效率。建立索引的一般原则为:在经常作为查询条件、连接条件、分组条件,连接操作的属性上建立索引。
注意:一个表可以建立多个索引,但只能建立一个聚簇索引。
确定存储结构
一般的存储方式有:顺序存储、散列存储、聚簇存储
一般情况下系统都会为数据选择一种最合适的存储方式。