数据库系统概论
概述
四个基本概念
- 数据(data):描述事物的符号记录称为数据
- 数据库(DB):长期储存在计算机内的,有组织的、可共享的大量数据的集合。
- 数据库管理系统(DBMS):计算机基础软件。具有
- 数据定义功能(DDL),定义数据对象的组成和结构
- 数据组织存储和管理
- 数据操纵功能(DML),实现数据的增删改查
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 数据库系统(DBS):由数据库(DB)、数据库管理系统(DBMS)、应用程序(APP)和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
数据库系统的特点
- 数据结构化
- 数据共享性高、冗余度低且易扩充
- 数据独立性高
- 物理独立性:应用程序与数据库中数据的物理存储相互独立。
- 逻辑独立性:应用程序与数据库的逻辑结构相互独立。
- 数据由数据库管理系统统一管理和控制
数据模型——数据库系统的核心和基础
两类数据模型
- 概念模型
按用户的观点来对数据和信息建模 - 逻辑模型和物理模型
- 逻辑模型:按计算机系统的观点对数据建模。包括层次模型、网状模型、关系模型、面向对象模型、对象关系数据类型、半结构化数据类型等
- 物理模型:数据在系统内部的表示方式和方法
- 逻辑模型到物理模型的转换,主要由数据库管理系统实现
概念模型
- 基本概念
- 实体:客观存在并可区分的事物
- 属性:实体具有的某一特性
- 码:唯一标志实体的属性
- 实体型:用实体名及其属性名集合来刻画和抽象同类实体。
- 联系: 实体之间的联系,通常指不同实体集之间的联系。
- 一种表示方法:实体-联系方法,也称为E-R模型
数据模型的组成要素
- 数据结构
- 数据操作
- 数据的完整性约束条件
关系模型
- 术语:
- 关系:对应一张表
- 元组:表中的一行
- 属性:表中的一列
- 码:某个属性组,唯一确定一个元组
- 域:一组具有相同数据类型是的集合
- 关系模式:对关系的描述
- 优点
- 与格式化模型不同,建立在严格的数学概念基础上
- 数据独立性保密性更高
- 概念单一、结构简单、清晰
- 存取路径对用户透明
- 缺点
- 查询效率不如格式化模型数据
数据库系统的结构
模式
- 模式是相对稳定的,实例是相对变动的
三级模式结构
- 模式,也称逻辑模式,是所有用户的公共数据视图,模式不涉及物理存储和硬件环境,与应用程序和开发环境无关。
- 外模式,也称子模式或用户模式,数据库用户的数据视图,外模式通常是模式的子集。
- 内模式,也称存储模式,是数据在数据库内部的组织方式
二级映象功能与数据独立性
- 数据独立性是指应用程序与数据库的数据结构之间相互独立
- 在物理结构改变时,尽量不影响应用程序,称为物理数据独立性
- 在逻辑结构改变时,尽量不影响应用程序,称为逻辑数据独立性
- 外模式/模式映像
模式改变时,可使外模式保持不变,保证逻辑独立性 - 模式/内模式映像
存储结构发生改变时,可使模式保持不变,保证物理独立性
- 数据库模式是数据库的中心与关键,应首先确定。
关系数据库结构及定义
在数据库中存储的是数据以及数据之间的联系。
定义
- 域
- 笛卡尔积
- 元组和分量
- 基数:一个域允许的不同取值的个数
- 关系
- 关系的度(单元关系,二元关系)
- 候选码(能唯一表示一个元组的属性集)——>挑一个作为主码
- 主属性:候选码的诸属性
其余——非主属性或非码属性 - 全码:关系模式的所有属性是这个关系模式的候选码
- 三种类型:
- 基本关系,又称基本表
- 查询表
- 视图表
- 六条性质:
- 行的顺序无所谓
- 列的顺序无所谓
- 列是同质的
- 不同列可出自同一域
- 任意两个元组候选码不同
- 分量必须取原子值(最基本的一条,满足即为第一范式)
关系模式
- 关系模式是静态的、稳定的,而关系是动态的
基本关系操作
- 查询操作
- 选择
- 投影
- 并
- 差
- 笛卡尔积//以上5种基本数据操作
- 连接
- 除
- 交
- 插入、删除、修改操作
结构化查询语言SQL
集
- 查询
- 数据定义语言
- 数据操纵语言
- 数据控制语言
于一体的关系数据语言。
关系的完整性
- 实体完整性:若属性A是关系R的主属性,则A不能取空值。
- 参照完整性:若属性F是关系R的外码,它与基本关系S的主码相对应,则对于R上的每一个元组在F上的值应该或者取空值、或者取S中某个元组的主码值。
- 用户定义的完整性
实体完整性和参照完整性是关系的两个不变性。
关系代数
传统集合运算
- 并
- 差
- 交
- 笛卡尔积
关系运算
象集:给定关系R(X,Z),x在R中的象集为Zx,表示R中属性组X上的属性值为x的诸元组在Z上分量的集合,是属性组值的子集
关系运算的定义:
- 选择
- 投影
- 连接
常用:- 等值连接
- 自然连接,一种特殊的等值连接,它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。
- 外连接:保留悬浮元组
- 左外连接:只保留左边关系的悬浮元组
- 右外连接:只保留右边关系的悬浮元组
- 除:若T为R除以S的结果,则T包含所有在R中而不在S中的属性及其值,且T与S的所有组合均在R中。
SQL
SQL的特点
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 以同一种语法结构提供多种使用方式:交互式和嵌入式
- 语言简洁,易学易用
SQL的基本概念
- 外模式包括视图和若干基本表,模式包括若干基本表,内模式包括若干存储文件。
- 在关系数据库管理系统中一个关系就对应一个基本表。一个或多个表对应一个存储文件,一个表可以带若干索引。索引也放在存储文件当中。
数据定义
模式的定义与删除
- 建立模式
1
2CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
[<表定义子句>|<视图定义子句>|<授权定义子句>]; - 删除模式
1
DROP SCHEMA <CASCADE|RESRICT>;
基本表的定义、删除与修改
- 创建表
1
2
3
4
5
6CREATE TABLE <表名> (
<列名><数据类型>[<列级完整性约束条件>]
[,<列名><数据类型>[<列级完整性约束条件>]]
...
[,<表级完整性约束条件>]
); - 模式与表
- 在表中给出模式名,如CREATE TABLE “<模式名>”.<表名>
- 创建模式语句同时创建表
- 设置所属模式,如下
1
2
3SHOW search_path; #显示当前搜索路径
SET search_path TO "<模式名>",PUBLIC; #设置搜索路径
CREATE TABLE <表名>();
- 修改基本表
1
2
3
4
5
6ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP[COLUMN]<列名>[CASCADE|RESCTICT]]
[DROP CONSTRAINT<完整性约束名>[CASCADE|RESTRICT]]
[ALTER COLUMN <列名><数据类型>]; - 删除表
1
DROP TABLE <表名> [RESTRICT|CASCADE];
索引的建立与删除
- 建立索引
1
2CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<ASC|DESC>][,<列名>[<ASC|DESC>]]...); - 修改索引
1
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
- 删除索引
1
DROP INDEX <索引名>;
数据操纵
数据查询
SELECT语句
1
2
3
4
5SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>...]|(SELECT语句)[AS](别名)
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];- tips
- SELECT * —-查询全部列
- 常用查询条件
- =,>,<,>=,<=,<>,!>,!<;NOT+ 上述比较符
- [NOT] BETWEEN AND
- [NOT] IN
- [NOT] LIKE
- IS [NOT] NULL
- AND,OR,NOT
- 聚集函数
- COUNT(*) !!!不忽略空值NULL
- COUNT([DISTINCT|ALL]<列名>)
- SUM([DISTINCT|ALL]<列名>)
- AVG([DISTINCT|ALL]<列名>)
- MAX([DISTINCT|ALL]<列名>)
- MIN([DISTINCT|ALL]<列名>)
- GROUP BY子句 + HAVING子句
连接查询
- 等值与非等值连接查询
- 自身连接(要给表取两个别名)
- 外连接
- 多表连接
嵌套查询
相关定义:- 一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
- 外层查询又称父查询,内层查询又称子查询
- 子查询不能使用ORDER BY语句
- 不相关子查询:子查询的查询条件不依赖于父查询
- 相关子查询:子查询的查询条件依赖于父查询,不能一次性将子查询的结果求解出来,而是反复求值
- 嵌套查询中维持ANY/SOME表示任一,ALL表示所有(任意)
- 带有EXISTS谓词的子查询,产生ture或false。(!!!所有带有IN谓词,、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS的子查询等价替代)
- 空值进行四则运算还是空值
集合查询–各查询结果列数必须相同,对应数据项的数据类型也必须相同
- UNION–自动去掉重复元组,如要保留则用UNION ALL操作符。
- INTERSECT
- EXCEPT
派生表查询:子查询嵌套于FROM子句中。(!!!AS关键字可以省略,但必须为派生关系指定别名)
插入数据
1 | INSERT INTO <表名>[(<属性列1>[,<属性列2>]...)] |
或
1 | INSERT INTO <表名>[(<属性列1>[,<属性列2>]...)] |
修改数据
1 | UPDATE <表名> |
删除数据
1 | DELETE FROM <表名> |
视图——只存放定义,不存放数据
- 建立视图创建视图时并不执行SELECT语句,对视图查询时,才将数据查出。
1
2
3CREATE VIEW <视图名> [<列名>[,<列名>]...]
AS <子查询>
[WITH CHECK OPTION]; - 删除视图
1
DROP VIEW <视图名> CASCADE;
- 视图的作用
- 视图能够简化用户操作
- 视图使用户能以多角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 更加清晰地表达查询
数据库安全
授予与收回权限(控制类指令)–实现自主存取控制
- 用户权限由两要素组成:数据库对象和操作类型
- GRANT:授予用户对列的操作权限
1
2
3
4GRANT <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO <用户>[,<用户>]...
[WITH GRANT OPTION]; - REVOKE
1
2
3
4REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
FROM <用户>[,<用户>]...
[CASCADE|RESTRINCT]; - 创建数据库模式的权限
1
CREATE USER <username> [WITH][DBA|RESOURCE|CONNECT];
数据库角色
- 数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。
- 创建角色
1
CREATE ROLE <角色名>;
- 给角色授权
1
2
3GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>
TO <角色>[,<角色>]...; - 将一个角色授权给其他角色或用户
1
2
3GRANT <角色1>[,<角色2>]...
TO <角色3>[,<用户1>]...
[WITH ADMIN OPTION]; - 角色权限的收回
1
2
3REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>
FROM <角色>[,<角色>]...
强制存取控制
敏感度标记:TS>=S>=C>=P
规则:
- 仅当主体的许可证级别大于或者等于客体的密级时,改主体才能读取相应的客体。
- 仅当主体的许可证级别小于或者等于客体的密级时,改主体才能写相应的客体。
审计功能–一种事后检查的安全机制
- 记录一切成功和不成功的操作
-AUDIT/NOAUDIT1
2[NO]AUDIT <操作名>[,<操作名>]...
ON <表名>;
数据加密
- 存储加密
- 传输加密
其他安全性保护
- 推理控制
- 隐蔽信道
- 数据隐私保护
数据库完整性——数据库的正确性和相容性
- 实体完整性
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个空值就拒绝插入或修改。
- 参照完整性
| (破坏参照完整性的)操作 | 违约处理 |
|---|---|
| 参照表插入元组 | 拒绝 |
| 参照表修改外码值 | 拒绝 |
| 被参照表删除元组 | 拒绝/级联删除/设置为空值 |
| 被参照表修改主码值 | 拒绝/级联删除/设置为空值 |
| 3. 用户自定义的完整性 |
1. 属性上的约束条件——不满足则拒绝执行
- NOT NULL
- UNIQUE
- CHECK短语
2. 元组上的约束条件——不满足则拒绝执行
完整性命令约束命名子句
- 完整性约束命名子句(新建表时)
1
CONSTRAINT <完整性约束条件名> <完整性约束条件>;
- 修改表中的完整性限制
删除完整性约束
1 | ALTER TABLE <表名> |
增加完整性约束
1 | ALTER TABLE <表名> |
断言
- 通过声明断言来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束,任何使断言不为真值的操作都会被拒绝执行。
- 创建断言语句
1
CREATE ASSERTION <断言名> <CHECK 子句>;
- 删除断言语句
1
DROP ASSERTION <断言名>;
触发器
- 定义触发器
1
2
3
4
5CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发事件> ON <表名>
REFERENCES NEW|OLD ROW AS <变量>
FOR EACH {ROW|STATEMENT}
[WHEN <触发条件>] <触发动作体>; - 激活触发器,
多个触发器时:- 执行该表上的BEFORE触发器
- 激活触发器的SQL语句
- 执行该表上的AFTER触发器
- 删除触发器
1
DROP TRIGGER <触发器名> ON <表名>;
关系数据理论
相关术语
- 函数依赖:R(U)是属性集U上的关系模式,X,Y是U的子集。对于R的任意一个可能关系r,r中不可能存在两个元组在X上的属性值相等,在Y上的属性值不等,称Y函数依赖于X,记作X->Y。
- 若Y$\subseteqq$X,为平凡的函数依赖。
- 部分函数依赖:X->Y,若对于X的每一个真子集X’,X’-/->Y,则称Y对X完全函数依赖,记作X$\frac{F}{}$>Y。否则称为部分函数依赖。
- 传递函数依赖:X->Y,Y-/->X,Y->Z(Z$\subsetneqq$Y,Y$\subsetneqq$X),称Z传递函数依赖于X,记作X$\frac{传递}{}$>Z。
- 超码:K为R<U,F>中的属性或属性组合,K->U,称K为超码。
- 候选码:K$\frac{F}{}$>U,称K为候选码。(特殊的超码)
- 主码:选定的一个候选码。
- 全码:整个属性组是码。
- 主属性:包含在任何一个候选码中的属性。
- 非主属性/非码属性:不包含在任何候选码中的属性。
- 多值依赖:X,Y,Z是U的子集,且Z=U-X-Y,若给定一对(x,z)值,有一组Y值,这组值仅仅决定于x值而与z无关。称Y多值依赖于X,记作X->->Y。
- 闭包:$X^{+}{F}$={A|X->A能由F导出},$X^{+}{F}$称为属性集X关于函数依赖集F的闭包。
- 最小依赖集/最小覆盖:
- 任一函数依赖右部仅含一个属性。
- 函数依赖个数精简到最少
- 函数依赖的左部精简到最少
范式
- 第一范式(1NF):每一个分量都是不可分的数据项
- 第二范式(2NF):1NF&不存在非主属性对任一候选码的部分函数依赖。
- 第三范式(3NF):2NF&不存在非主属性对任一候选码的传递函数依赖。
- 所有属性都是主属性的模式最高一定可以达到
- BC范式(BCNF):每一个决定因素都包含码,消除了插入、删除的异常。满足:
- 3NF
- 所有主属性对于任一不包含它的码也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性。
- (全码组成的关系模式最高一定可以到达||3NF+唯一候选码||二元模式最高一定可以到达)
- 4NF:属性之间不允许有非平凡且非函数依赖的多值依赖
- 判断范式
- 求候选码
- 如果有属性只在函数依赖集的左边出现,则该属性一定包含在候选码中(继续求它的闭包,如果他的闭包是属性全集,则为候选码,如果不是,则需要结合其他属性求闭包,继而判断是否是候选码)
- 只在函数依赖集右边出现的属性,一定不属于候选码
- 对于左右都出现过的属性:
(1)先结合只在左边出现的属性求闭包,看看是否包括所有属性,如果他的闭包是属性全集,则为候选码;
(2)如果没有包括所有属性,就结合其他左右都出现的求闭包,看看是否包括所有属性,如果他的闭包是属性全集,则为候选码 - 如果有属性不在函数依赖集中出现(外部属性),那么一定包含在候选码中(继续求它的闭包,如果他的闭包是属性全集,则为候选码,如果不是,则需要结合其他属性求闭包,继而判断是否是候选码)
- 分主属性、非主属性
- 判断范式。
- 求候选码
规范化
1NF$\frac{消除非主属性对码的部分函数依赖}{}$>2NF$\frac{消除非主属性对码的传递函数依赖}{}$>3NF$\frac{消除主属性对码的部分和传递函数依赖}{}$>BCNF$\frac{消除非平凡且非函数依赖的多值依赖}{}$>4NF
函数依赖的公理系统
- 推理规则——Armstrong公理系统
- 自反率:
若Y$\subseteqq$X$\subseteqq$U,则X——>Y被F所蕴含 - 增广率:
若X——>Y被F所蕴含,且Z$\subseteqq$U,则XZ——>YZ被F所蕴含 - 传递率:
若X——>Y及Y——>Z被F所蕴含,则X——>Z被F所蕴含
- 自反率:
模式的分解
无损连接性
- 保证不丢失信息
- 判断无损连接
保持函数依赖性
- 减轻或解决各种异常情况
- 判断保持函数依赖:
- 求投影F’=F1∪F2∪…Fn是否包含全部函数依赖。
- 对于缺少的函数依赖,求左侧属性在判断F’中的闭包是否蕴含右侧。($F’^{+}$==$F^{+}$?)
模式分解算法
- 保持函数依赖,最多可以达到3NF。
- 保持无损连接性,最多可以达到4NF。
- 保持函数依赖和无损连接性,最多可以达到3NF
数据库恢复技术
事务的基本概念
- 事务的定义:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
- 事务通常以BEGIN TRANSACTION开始,以COMMIT(提交)或ROLLBACK(回滚)结束。
- 事务的ACID特性:
- 原子性:事务是数据库的逻辑工作单位,事务中所包括的诸操作要么都做,要么都不做。
- 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
- 隔离性:对于并发执行而言,一个事务的执行不能被其他事务干扰。
- 持久性:也称永久性,一个事务一旦提交,它对数据库中数据的改变就应该是永久的。
故障的种类
- 事务内部的故障:非预期的,不能由应用程序处理的。
- 常见原因:
- 运算溢出
- 并发进程发生死锁而被选中撤销该事务
- 违反了某些完整性限制
- 恢复操作:事务撤销(UNDO):反向扫描日志文件,查找事务的更新操作执行逆操作
- 常见原因:
- 系统故障:称为软故障,指造成系统停止运转的任何事件,使得系统要重新启动
- 常见原因
- 特定类型的硬件错误
- 操作系统故障
- DBMS代码错误
- 系统断电
- 恢复策略
- 正向扫描日志文件
- 发生系统故障时,事务未提交:强行撤销所有未完成的事务
- 发生系统故障时,事务已提交,但缓冲区的信息未完全写回到磁盘上:重做所有已提交的事务。
- 常见原因
- 介质故障:称为硬故障,指外存故障。
- 常见原因
- 磁盘损坏
- 磁头碰撞
- 操作系统的某种潜在错误
- 瞬时强磁场干扰
- 恢复策略
- 装入数据库发生介质故障前某个时刻的数据副本
- 重做此时起的所有成功事务,将这些事务已提交的结果重新记入数据库。
- 使用检查点改善恢复效率
- 数据库镜像
- 常见原因
- 计算机病毒
- 人为故障或破坏的计算机程序,可以繁殖和传播,等同于介质故障。
恢复的实现技术
- 基本原理:冗余——利用存储在系统其他地方的冗余数据来重建数据库中已被破坏或不正确的那部分数据。
- 如何建立冗余数据?数据转储和登记日志文件
数据转储
- 转储方式分类
- 海量转储
- 增量转储
- 转储状态分类
- 动态转储
- 静态转储
登记日志文件——用来记录事务对数据库的更新操作的文件
- 登记内容(每个登记内容作为日志文件的一个日志记录):
- 各个事务开始标记
- 各个事务结束登记
- 各个事务的所有更新操作
- 日志记录内容
- 事务标识
- 操作类型
- 操作对象
- 更新前数据的旧值
- 更新后数据的新值
- 作用:
- 进行事务故障和系统故障恢复
- 协助后备副本对介质故障进行恢复
- 登记日志文件时必须遵循两条原则:
- 登记的次序严格按并发事务执行的时间次序。
- 必须先写日志文件,后写数据库。
并发控制
概述
- 事务是并发控制的基本单位
- 并发操作带来的数据不一致性
- 丢失修改
- 读“脏”数据
- 不可重复读/幻影现象
- 主要方法
- 封锁
- 时间戳
- 乐观控制法
- 多版本控制
封锁
- 排他锁/写锁(X锁)
- 共享锁(S锁)
- 封锁协议:
- 一级封锁协议:修改数据之前必须加X锁,直到事务结束才释放——解决丢失修改
- 二级封锁协议:读数据之前必须加S锁,读完后释放——解决读脏数据
- 三级封锁协议:读数据之前必须加S锁,直到事务结束才释放——解决不可重复读
活锁和死锁
当两个(或多个)并发的事务分别等待对方释放封锁的资源,而使事务处于长期等待状态的现象称为死锁。
解决活锁的方法:先来先服务策略
解决死锁的两种方法:
- 预防:
- 一次封锁法:为了完成一个事务,一次性封锁所需要的全部表
- 顺序封锁法:所有的事务约定都按相同的顺序来封锁表
- 诊断与解除
- 超时法
- 事务等待图法
- 预防:
并发调度的可串行性——并发事务正确调度的准则
- 冲突可串行化是可串行化的充分条件
两段锁协议
- 事务分为两个阶段
- 扩展阶段,获得封锁
- 收缩阶段,释放封锁
- 事务遵守两段锁协议是可串行化的充分条件
封锁的粒度
封锁对象的大小称为封锁粒度,封锁对象可以是逻辑对象,也可以是物理对象
封锁粒度越大、数据库所能封锁的数据单元就越少,并发度就越小,系统开销越小;反之,封锁粒度越小、数据库所能封锁的数据单元就越多,并发度就越大,系统开销越大
多粒度封锁
- 显示封锁:应事务要求直接加到数据对象上的锁
- 隐式封锁:由于上级对象加锁而导致该数据对象加上了锁