数据库系统
本文最后更新于 2023-10-12,文章内容可能已经过时。
数据库系统
1.概论
1.1 数据库:
是长期储存在计算机内、有组织的、可共享的数据集合.
1.2 数据库管理系统:
管理数据库,支持应用的软件系统 DataBase Management System (DBMS).
1.3 数据库系统:
1.4 文件系统的劣势:
数据冗余和不一致
数据访问困难
传统文件处理环境不支持方便而高效的方式去获取数据,不能对变化的需求做出更快的反应。
数据孤立
数据分散在不同文件中,这些文件又可能具有不同的格式,因此编写新的应用程序来检索适当数据是很困难的.
完整性问题
数据库所存储的数据值必须满足某些特定一致性约束文件系统中,新的约束加入时,很难通过修改程序来体现这些新约束,当约束涉及到不同文件中的多个数据项时,问题更为复杂.
原子性问题
操作是原子的:为了保证数据库的一致性,一些操作要么全部发生、要么根本不发生,例如:转账在传统文件处理系统中,很难保持上述原子性。
并发访问异常
了提高系统的总体性能及加快响应速度,许多系统需要允许多个用户同时更新数据,在文件系统中,数据可能被多个不同应用程序访问,这些程序相互间事先没有协调,管理就很难进行.
安全性问题
并非数据库系统的所有用户都可以访问所有数据,由于文件系统中应用程序总是即席地加入到文件处理系统中来,这样的安全性约束难以实现.
1.5 数据库系统结构:
1.6 数据抽象:
对于用户系统地隐藏关于数据存储和维护的某些细节,屏蔽复杂性,简化用户与系统的交互.
1.6.1 视图抽象:
1.6.2 逻辑抽象:
1.6.3 物理抽象:
1.7 数据独立性:
1.7.1 物理数据独立性:
1.7.2 逻辑数据独立性:
1.8 数据模型:
常用的数据模型:
1.8.1 层次数据模型:
有且只有一个结点没有双亲结点,这个结点称为根结点,根以外的其它结点有且只有一个双亲结点.
一个例子:
优缺点:
1.8.2 网状数据模型:
优缺点:
1.9 数据库语言:
2.关系数据库:
2.1 关系模型:
2.2 关系数据结构的基本概念:
2.2.1属性:
关系表的列,顺序无关紧要
2.2.2域:
属性的所有可能取值的集合,称为该属性的域
2.2.3关系:
笛卡尔积中的每一个元素称为一个元组.
2.2.4关系模式:
关系的型.
注意此处的关系是数据库字段之间的关系.
举个例子:
2.2.5 关系数据库:
2.3 完整性约束:
2.3.1 超码:
唯一的标识一个元组.
2.3.2 候选码:
超码.且真子集不是超码.一个关系模式可以有多个候选码.
2.3.3 主键(主码):
被数据库设计者选中的,用来在同一关系中区分不同元组的候选键.
选择原则:值从不或很少变化的.
一个关系模式只能具有一个主键,主键中的属性称为关系的主属性.
2.3.4 外键(外码):
主键在其他表中.
外键并不一定要与相应的主键同名。
一般情况下,外键与相应的主键往往取相同的名字,以便于识别.
2.3.5 实体完整性约束:
主键不能为空.
2.3.6 关联完整性约束:
外键的值必须有对应的主键.
2.4 关系运算:
2.4.1 关系代数运算:
选择:选出若干行
投影:选出若干列
并:合并元组
差:减去元组
笛卡尔积:列相乘
关系代数的基本运算足以表达任何关系代数查询,但是,如果我们把自己局限于基本运算,某些常用的查询表达出来会显得冗长.
因而,我们定义了一些附加运算,它们不能增加关系代数的表达能力,却可以简化一些常用的查询.
2.4.2 附加关系代数运算:
交:交集
连接:
选取属性间满足一定关系的元组.
2.4.2.1 等值连接:
2.4.2.2 自然连接:
匹配不上的就不要了.
2.4.2.3 左外连接:
匹配不上的只保留左边.
右边外连接也是一样的,两个连接的交集是全外连接.
2.4.3 拓展关系代数运算:
2.5 元组关系演算:
举几个例子:
2.6 关系运算安全性:
如果一个关系运算系统不产生无限关系和无穷验证,则这个运算是安全的.
关系代数系统是安全的,元组关系演算不安全.这两种运算之间具有等价性.
关系运算是关系数据库查询语言的基础.
2.7 SQL:
结构化查询语言.
2.7.1 DDL:
|
|
|
|
|
|
2.7.2 授权:
|
|
|
|
2.7.3 查询:
2.7.3.1 单表查询:
1.消除重复:distinct 只用一次就行。
2.谓词一览:
3.order by:
放在查询语句的最后,先写orderby +列名,再写策略:
4.聚集查询:
位置在select后面,举例如下:
|
|
5.分组:
最后,只能出现分组属性和聚集函数。
|
|
having:作用于分组:
|
|
6.<>也可用于字符串
2.7.3.2 连接查询:
出现在from后面,表后面。
1.等值连接:
|
|
2.自然连接:
在等值连接的基础上,去掉重复的列。
关键字natural join.不需要加条件,自动根据名字匹配.
3.外连接与内连接:
left,right,inner.
2.7.3.3 嵌套查询:
代替表存在的地方,比如where后面。
|
|
子查询不建议、或无法使用ORDER BY子句。
带有exist的子查询:
|
|
2.7.4 插入:
|
|
2.7.5 更新:
|
|
2.7.6 删除:
|
|
3.数据库完全性与完整性:
3.1 安全性:
3.1.1 用户标识与鉴别:
3.1.2 存取控制机制:
3.1.3 授权与权限收回:
|
|
|
|
数据库角色:
3.1.4 审计:
3.1.5 数据加密:
3.2 数据完整性:
3.2.1 域完整性:
在create table时候定义.
3.2.2 实体完整性:
指关系的主码不能重复也不能取空值.
3.2.3 关系完整性:
主外键之间互相参照完整.
3.2.4 断言:
3.2.5 触发器:
触发器是用户定义在关系表上的一类由事件驱动的特殊过程
定义之后的触发器存储在数据库服务器中.
任何用户对表的增、删、改操作均由服务器自动激活相应的触发器.
不同RDBMS实现的触发器语法各不行同,互不兼容.
|
|
4.数据库设计:
4.1 数据库设计步骤:
4.2 概念数据库设计:
主要包括模式设计和事务设计。
模式设计以实体为主,产出ER图。
er图举例子:
4.3 逻辑数据库设计:
把概念数据库设计阶段产生的概念数据库模式,变换为逻辑数据库模式.
动态关系至少具有第三规范形式,静态关系至少具有第一规范形式;
转化格式为:
加下划线的为数据库表的主键.
4.3.1 关系的转化:
一对一:
1.在一中增加另一个一的对应字段。
2.建立一个单独的关系表示(不推荐)
一对多:
1.在多中建立字段表征一.
2.单独建立表.
多对多:
建立中间表。
4.3.2 函数依赖:
可以通过属性x确定属性y,则称y依赖于x。
若y不是x的子集,则称为非平凡函数依赖。一般依赖均指非平凡函数依赖。
4.3.2.1 各种其他依赖:
4.3.2.2 依赖求解:
1.求候选键:
首先进行分类。
对于给定的关系模式及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选键的成员。
对候选键的成员进行组合,如果某一组合的闭包:
是全部列,那么这个组合为候选键。
2.求最小覆盖:
让依赖看起来尽可能的简介,右侧只能有一个属性。
3.模式分解:
将一个1NF的关系分解为多个2NF的关系。
4.无损连接性:
判断无损连接性的方法:
1.初始化一张图:
上方是所有的属性,左侧是最后的划分。
a1到a5是一个元组,根据左侧划分填入表中。
2.填数:
根据依赖的顺序,找左侧数据,如果左侧行数据是a,则修改这些行所在的右侧列的值.
右侧有a则是a,右侧没有a则随便换一个b上去。
3.结束:
直到出现一行全是a的情况,出现则代表有无损连接性,不出现则没有无损连接性。
4.3.3 范式:
4.3.3.1 第一范式(1NF):
设R是一个关系模式。如果R的每个属性的值域都是不可分的简单数据项的集合,则称这个关系模式为第一范式关系模式,记作1NF。
4.3.3.2 第二范式(2NF):
若关系模式R是1NF,而且每一个非键属性都完全函数依赖于R的候选键(码),则R称为第二范式关系模式,记作2NF。
在满足1NF的前提下,表中不存在部分依赖,非主键列要完全依赖于主键。(主要是说在联合主键的情况下,非主键列不能只依赖于主键的一部分)。
举个例子:
缺点:
1·对于查询需要对多个表进行关联,导致性能降低
2·更难进行索引优化
4.3.3.3 第三范式(3NF):
不存在传递依赖。
设计范式的要求:
4.4 物理数据库设计:
5. 物理存储结构:
5.1 物理存储设备:
5.2 磁盘:
随机存取。
以扇区为单位。
磁盘读写是数据库应用的瓶颈,数据库的物理存储结构、数据库操作算法和查询优化的研究都把最小化磁盘读写次数作为重要目标之一。
5.2.1 缓冲处理:
5.3 磁盘文件:
5.3.1 文件和关系:
5.3.2 文件记录:
主要分为定长记录和边长记录:
5.3.3 无序与有序文件:
无序文件:查找效率低,增删效率高。
有序文件:查找效率高,插入效率低。
5.4 HASH文件:
用Hash函数来存储和存取关系记录。
简单hash不再赘述。
动态hash:
可拓展hash:
线性hash:
5.5 索引文件:
索引是一种数据结构,通常是有序文件。
索引文件分类:
5.5.1主索引:
索引域是主键。
5.5.2 聚集索引:
排序,一一对应。
5.5.3 辅助索引:
建立在键值之上:
5.5.4 b+树索引:
定义:
举例:
特征:
5.5.5 多维索引:
6. 查询处理与优化:
6.1 关系代数操作算法:
算法运行环境:
M+1个缓冲区(输入和输出)+外存中存放的数据。
算法运行代价:
磁盘块存取数。
6.1.1 选择操作:
6.1.2 投影操作:
6.1.3 连接操作:
三种连接算法:
6.1.3.1.nest-loop-join:
循环暴力.
6.1.3.2.sort-merge join:
排序之后匹配。
6.1.3.3:hash-join:
分别哈希,对比哈希值。
6.1.3.4 计算连接代价:
取代价最小的连接顺序。
6.1.4 集合操作:
6.2 查询优化:
6.2.1 下推选择:
当查询中涉及视图时,某些情况下:
首先将选择操作尽可能往树的上部移动是很重要的。然后再把选择下推到所有可能的分枝。
6.2.2 启发式优化:
6.2.3 操作代价的估计:
由逻辑计划可派生出多个不同物理计划。
连接条件的结果估计:
6.2.4 选择连接顺序:
6.2.5 物化与流水化:
6.2.6 其他策略:
小结:
7.事务处理与恢复:
7.1 事务:
是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
一个事务由一条或者多条SQL语句组成,一个程序中有一个或者多个事务。
事务是并发控制和恢复的基本单位。
7.2 定义:
7.3 特性:
7.4 并发控制保证:
多个事务同时运行时,保证i.
事务在运行过程中被强行停止时,保证ad.
7.5 原理:
7.6 事务执行方式:
在同一时刻并发运行大量事务时,有多种实现方式.
7.6.1 串行执行:
同一时刻只有一个事务在运行.
比较简单,但是不能充分的利用系统资源.
7.6.2 交叉并发:
交替执行事务.
7.6.3 同时并发:
多个处理机同时运行多个事务.
是最理想的并发事务处理方式.
7.7 并发问题以及解决:
7.7.1 并发问题:
7.7.2 事务调度:
7.7.2.1 串行调度.
是正确的,但是用串行执行一样,存在系统资源利用率不高的问题.
7.7.2.2 可串行化调度:
7.7.2.3事务调度的表示方式:
r是读,w是写.
7.7.2.4 冲突:
7.7.2.5 冲突可串行化:
通过相邻动作的交换,将可串行化调度转换为串行调度.
7.7.2.6 优先图:
简单的判断一个调度是否是冲突可串行化的.
节点是事务.
如果调度中存在ti小于tj(按照先后顺序判断),则存在一条由i到j的弧.
简单的判断方法:
1.根据事务的a,b(操作的对象)进行分组
2.按照分组后的顺序,寻找r-w,w-r,w-w,如果找到后所对应的数字不同,则存在一条弧.
如果画完了有环,则是非冲突可串行化,就是有冲突,但是不能串行化的。
7.8 并发控制协议:
7.8.1 锁:
锁是数据库元素上的并发控制标志.
每个事务在存取一个数据库元素之前必须获得这个数据库元素上的锁.
一个事务需要获得的锁的类型依赖于它将在数据库元素上执行什么样的操作.
7.8.2 两阶段锁协议:
7.8.3 时间戳协议:
8. 故障恢复:
8.1 数据库恢复:
8.2 故障种类以及恢复:
8.2.1 介质故障:
8.2.2 系统故障:
撤销或者重做.
8.2.3 事务故障:
撤销事务,强行回滚.
8.3 数据库恢复:
恢复整个数据库文件.
8.3.1 基于日志的恢复:
8.3.1.1 日志缓冲技术:
8.3.1.2 更新技术:
推迟更新:
在一个事务所有更新操作对应的日志记录写入
永久存储器之前,该事务不能提交.
事务在不能提交之前,不能提交数据库.
恢复时;
从后往前开始扫描日志,建立两个事务表
提交事务表:已经提交的,且磁盘上有日志记录<COMMIT T>的所有事务
未提交事务表:那些具有< START T>日志记录,但无对应 < COMMIT T>的所有事务
及时更新:
事务直接提交数据库。
日志恢复:
undo就是回滚.没提交的就回滚.
redo就是提交.以及提交了的就提交.
8.3.1.3 检查点恢复:
1.从后到检查点.
2.从检查点到最后.
8.3.2 基于冗余存储的恢复:
主从复制.