(一)绪论
数据(Data):是数据库中存储的基本对象
数据的定义:描述事物的符号记录
数据的种类:文字、图形、图象、声音等
数据的特点:数据与其语义是不可分的
数据库(Database,简称DB):是长期储存在计算机内、有组织的、可共享的大量数据集合
数据库管理系统(Database Management System,简称DBMS):是位于用户与操作系统之间的一层数据管理软件。
DBMS的用途:科学地组织和存储数据、高效地获取和维护数据。
DBMS的主要功能:
数据库的运行管理 保证数据的安全性、完整性 多用户对数据的并发使用
发生故障后的系统恢复 数据库的建立和维护功能(实用程序) 数据库数据批量装载
数据库转储 介质故障恢 数据库的重组织 性能监视等
数据库系统(Database System,简称DBS)是指在计算机系统中引入数据库后的系统构成。
数据库系统的构成:由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员(和用户)构成。(三树一人)
数据管理:对数据进行分类、组织、编码、存储、检索和维护,是数据处理的中心问题
数据模型这个工具来抽象、表示和处理现实世界中的数据和信息。
数据模型分成两个不同的层次
(1) 概念模型 也称信息模型,它是按用户的观点来对数据和信息建模。
(2) 数据模型 主要包括网状模型、层次模型、关系模型等,它是按计算机系统的观点对数据建模。
- 客观对象的抽象过程---两步抽象:① 现实世界中的客观对象抽象为概念模型;② 把概念模型转换为某一DBMS支持的数据模型。
- 数据结构:对象类型的集合 即数据结构是对系统静态特性的描述
两类对象:①与数据类型、内容、性质有关的对象 ②与数据之间联系有关的对象
数据操作:对数据库中各种对象(型)的实例(值)允许执行的操作及有关的操作规则
数据操作的类型:检索 更新(包括插入、删除、修改)
数据模型对操作的定义:
- 操作的确切含义
- 操作符号
- 操作规则(如优先级)
- 实现操作的语言数据模型对操作的定义
数据操作是对系统动态特性的描述。
数据模型对约束条件的定义:反映和规定本数据模型必须遵守的基本的通用的完整性约束条件。提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件。
信息世界中的基本概念
(1) 实体(Entity)
客观存在并可相互区别的事物称为实体。
(2) 属性(Attribute)
实体所具有的某一特性称为属性。
一个实体可以由若干个属性来刻画。
(3) 码(Key)
唯一标识实体的属性集称为码。
(4) 域(Domain)
属性的取值范围称为该属性的域。
(5) 实体型(Entity Type)
用实体名及其属性名集合来抽象和刻画
同类实体称为实体型
(6) 实体集(Entity Set)
同型实体的集合称为实体集
联系(Relationship)
现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系
实体型间联系
两个实体型 一对一联系(1:1)
三个实体型 一对多联系(1:n)
一个实体型 多对多联系(m:n)
两个实体型间的联系
- 一对一联系
- 如果对于实体集A中的每一个实体,实体集B中至多有一个实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系。记为1:1。
- 一对多联系
- 如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系记为1:n
- 多对多联系(m:n)
- 如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每一个实体,实体集A中也有m个实体(m≥0)与之联系,则称实体集A与实体B具有多对多联系。记为m:n
概念模型的表示方法
- 实体-联系方法(E-R方法)
- 用E-R图来描述现实世界的概念模型
- E-R方法也称为E-R模型
常用数据模型
- 非关系模型
- 层次模型(Hierarchical Model)
- 网状模型(Network Model )
2.数据结构:以基本层次联系为基本单位
基本层次联系:两个记录以及它们之间的一对多(包括一对一)的联系
- 面向对象模型(Object Oriented Model)数据结构:对象
- 关系模型(Relational Model) 数据结构:表
- 层次模型满足下面两个条件的基本层次联系的集合为层次模型。①有且只有一个结点没有双亲结点,这个结点称为根结点 ②根以外的其它结点有且只有一个双亲结点
表示方法
实体型:用记录类型描述。每个结点表示一个记录类型。
属性:用字段描述。每个记录类型可包含若干个字段。
联系:用结点之间的连线表示记录(类)型之间的一对多的联系。
网状数据模型的数据结构
网状模型:满足下面两个条件的基本层次联系的集合为网状模型。①允许一个以上的结点无双亲;②一个结点可以有多于一个的双亲。
表示方法(与层次数据模型相同)
实体型:用记录类型描述。 每个结点表示一个记录类型。
属性:用字段描述。 每个记录类型可包含若干个字段。
联系:用结点之间的连线表示记录(类)型之间的一对多的父子联系。
关系模型的基本概念
关系(Relation)一个关系对应通常说的一张表。
元组(Tuple)表中的一行即为一个元组。
属性(Attribute)表中的一列即为一个属性,给每一个属性起一个名称即属性名。关系必须是规范化的,满足一定的规范条件
最基本的规范条件:关系的每一个分量必须是一个不可分的数据项。
- 查询、插入、删除、更新
- 数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合
- 存取路径对用户隐蔽,用户只要指出“干什么”,不必详细说明“怎么干”
关系模型的完整性约束
- 实体完整性
- 参照完整性
- 用户定义的完整性
关系数据模型的存储结构
① 表以文件形式存储
② 有的DBMS一个表对应一个操作系统文件
③ 有的DBMS自己设计文件结构
关系模型的优缺点
- 优点
- 建立在严格的数学概念的基础上
- 概念单一。数据结构简单、清晰,用户易懂易用
- 实体和各类联系都用关系来表示。
- 对数据的检索结果也是关系。
- 关系模型的存取路径对用户透明
- 具有更高的数据独立性,更好的安全保密性
- 简化了程序员的工作和数据库开发建立的工作
- 缺点
① 存取路径对用户透明导致查询效率往往不如非关系数据模型
② 为提高性能,必须对用户的查询请求进行优化
③ 增加了开发数据库管理系统的难度
数据库系统外部的体系结构
- 单用户结构
- 主从式结构
- 分布式结构
- 客户/服务器结构
- 浏览器/应用服务器/数据库服务器结构
分布式结构的数据库系统
- 数据库中的数据在逻辑上是一个整体,但物理地分布在计算机网络的不同结点上。
- 网络中的每个结点都可以独立处理本地数据库中的数据,执行局部应用
- 同时也可以同时存取和处理多个异地数据库中的数据,执行全局应用
- 优点
- 适应了地理上分散的公司、团体和组织对于数据库应用的需求。
- 缺点
- 数据的分布存放给数据的处理、管理与维护带来困难。
- 当用户需要经常访问远程数据时,系统效率会明显地受到网络传输的制约
数据库管理员(DBA)
- 决定数据库中的信息内容和结构
- 决定数据库的存储结构和存取策略
- 定义数据的安全性要求和完整性约束条件
关系数据库
- 关系模型的组成
- 关系数据结构
- 关系操作集合
- 关系完整性约束
- 1) 常用的关系操作
- 查询:选择、投影、连接、除、并、交、差
- 数据更新:插入、删除、修改
- 查询的表达能力是其中最主要的部分
- 2) 关系操作的特点
- 集合操作方式,即操作的对象和结果都是集合。
- 非关系数据模型的数据操作方式:一次一记录
- 文件系统的数据操作方式
- 集合操作方式,即操作的对象和结果都是集合。
- 3) 关系数据语言的种类
- 关系代数语言
- 用对关系的运算来表达查询要求
- 关系代数语言
- 4) 关系数据语言的特点
- 关系语言是一种高度非过程化的语言:
- 存取路径的选择由DBMS的优化机制来完成
- 用户不必用循环结构就可以完成数据操作
- 能够嵌入高级语言中使用
- 关系代数、元组关系演算和域关系演算三种语言在表达能力上完全等价
- 关系语言是一种高度非过程化的语言:
关系
域(Domain)
域是一组具有相同数据类型的值的集合。例:
1. 整数
2.介于某个取值范围的日期
3.{‘男’,‘女’}
4.长度指定长度的字符串集合
5.介于某个取值范围的整数
6.实数
笛卡尔积(Cartesian Product)给定一组域D1,D2,…,Dn,这些域中可以有相同的。D1,D2,…,Dn的笛卡尔积为:
D1×D2×…×Dn={(d1,d2,…,dn)|diÎDi,i=1,2,…,n}
所有域的所有取值的一个组合 不能重复
元组(Tuple)笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组。
- 3) 分量(Component)
- 笛卡尔积元素(d1,d2,…,dn)中的每一个值di叫作一个分量。
- 4) 基数(Cardinal number)
- 若Di(i=1,2,…,n)为有限集,其基数为mi(i=1,2,…,n),则D1×D2×…×Dn的基数M为:
- 5)笛卡尔积的表示方法
- 笛卡尔积可表示为一个二维表。表中的每行对应一个元组,表中的每列对应一个域。
关系(Relation)
1) 关系
D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的关系,表示为 R(D1,D2,…,Dn)
R:关系名
n:关系的目或度(Degree)
2) 元组
关系中的每个元素是关系中的元组,通常用t表示。
3) 单元关系与二元关系
当n=1时,称该关系为单元关系(Unary relation)。
当n=2时,称该关系为二元关系(Binary relation)
4) 关系的表示
关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域。
5) 属性
关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性(Attribute)。 n目关系必有n个属性。
6) 码
候选码(Candidate key)
①若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码
②在最简单的情况下,候选码只包含一个属性。称为全码(All-key)
在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称为全码(All-key)
主码
若一个关系有多个候选码,则选定其中一个为主码(Primary key)主码的诸属性称为主属性(Prime attribute)。不包含在任何侯选码中的属性称为非码属性(Non-key attribute)
7) 三类关系
基本关系(基本表或基表)实际存在的表,是实际存储数据的逻辑表示
查询表 结果对应的表
视图表 由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系的性质
① 列是同质的(Homogeneous)
每一列中的分量是同一类型的数据,来自同一个域
② 不同的列可出自同一个域
其中的每一列称为一个属性 不同的属性要给予不同的属性名
③ 列的顺序无所谓
列的次序可以任意交换 ,遵循这一性质的数据库产品(如ORACLE),增加新属性时,永远是插至最后一列,但也有许多关系数据库产品没有遵循这一性质,例如FoxPro仍然区分了属性顺序。
④ 任意两个元组不能完全相同
由笛卡尔积的性质决定但许多关系数据库产品没有遵循这一性质。例如:Oracle,FoxPro等都允许关系表中存在两个完全相同的元组,除非用户特别定义了相应的约束条件。
⑤ 行的顺序无所谓
行的次序可以任意交换,遵循这一性质的数据库产品(如ORACLE),插入一个元组时永远插至最后一行,但也有许多关系数据库产品没有遵循这一性质,例如FoxPro仍然区分了元组的顺序。
⑥ 分量必须取原子值
每一个分量都必须是不可分的数据项。这是规范条件中最基本的一条
关系模式(Relation Schema)是型。关系是值关系模式是对关系的描述,它包括以下要素:
-
元组集合的结构:关系模式定义了元组的集合,每个元组代表关系中的一个实例。
-
属性构成:关系模式指定了关系中的属性,每个属性代表关系中的一个特征或字段。
-
属性来自的域:每个属性来自于一个特定的域,域定义了属性的取值范围。
-
属性与域之间的映象关系:关系模式指定了属性与域之间的映射关系,确保属性的取值符合域的要求。
-
元组语义以及完整性约束条件:关系模式可以包含有关元组语义和完整性约束条件的描述,用于限制关系中的数据。
-
属性间的数据依赖关系集合:关系模式可以包含属性间的数据依赖关系集合,用于描述属性之间的相互关系,例如主键、外键、函数依赖等。
定义关系模式
关系模式可以形式化地表示为:
R(U,D,dom,F)
R | 关系名 |
U | 组成该关系的属性名集合 |
D | 属性组U中属性所来自的域 |
dom | 属性向域的映象集合 |
F | 属性间的数据依赖关系集合 |
关系模式通常可以简记为 R (U) 或 R (A1,A2,…,An )
R 关系名
A1,A2,…,An 属性名
注:A1,A2,…,An为属性名;域名及属性向域的映象常常直接说明为属性的类型、长度。
关系模式:对关系的描述静态的、稳定的
关系:关系模式在某一时刻的状态或内容动态的、随时间不断变化的,关系模式和关系往往统称为关系。两者通过上下文加以区别。
1. 关系数据库
在一个给定的应用领域中,所有实体及实体之间联系的关系的集合构成一个关系数据库。
2. 关系数据库的型与值
关系数据库也有型和值之分,关系数据库的型称为关系数据库模式,是对关系数据库的描述
若干域的定义,在这些域上定义的若干关系模式,关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常简称为关系数据库
3 关系的完整性
关系模型的完整性规则是对关系的某种约束条件。
关系模型中三类完整性约束:
实体完整性
参照完整性
用户定义的完整性
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。
实体完整性
实体完整性规则(Entity Integrity)
若属性A是基本关系R的主属性,则属性A不能取空值。
关系模型必须遵守实体完整性规则的原因:
(1) 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集或多对多联系。
(2) 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识。
(3) 相应地,关系模型中以主码作为唯一性标识。
(4) 主码中的属性即主属性不能取空值。 空值就是“不知道”或“无意义”的值。
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。
注意 :实体完整性规则规定基本关系的所有,主属性都不能取空值。
参照完整性
1. 关系间的引用
2. 外码
3. 参照完整性规则
1. 关系间的引用
在关系模型中实体及实体间的联系都是用
关系来描述的,因此可能存在着关系与关
系间的引用。
2.外码(Foreign Key)
设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码。基本关系R称为参照关系(Referencing Relation)基本关系S称为被参照关系(ReferencedRelation)或目标关系(Target Relation)。
说明
- 关系R和S不一定是不同的关系
- 目标关系S的主码Ks 和参照关系的外码F必须定义在同一个(或一组)域上
- 外码并不一定要与相应的主码同名
当外码与相应的主码属于不同关系时,往往 取相同的名字,以便于识别
3. 参照完整性规则
若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
· 或者取空值(F的每个属性值均为空值)
· 或者等于S中某个元组的主码值。
用户定义的完整性
- 用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。
- 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能。
Operation 运算,操作
Operator 算子
Operand 操作数
1.关系代数
一种抽象的查询语言,用对关系的运算来表达查询
2.关系代数运算的三个要素
运算对象:关系
运算结果:关系
运算符:2类(集合运算和关系运行)
关系代数运算符
运算符 | 含义 | |
集合运算符 | ∪ | 并 |
- | 差 | |
∩ | 交 | |
× | 笛卡尔积 | |
专门的关系运算符 | σ | 选择 |
∏ | 投影 | |
连接 | ||
÷ | 除 |
4.关系代数运算的分类
传统的集合运算
并、差、交、广义笛卡尔积
专门的关系运算
选择、投影、连接、除
5.常用的表示记号
(1) R,t∈R,t[Ai]
设关系模式为R(A1,A2,…,An),它的一个关系设为R。t∈R表示t是R的一个元组,t[Ai]则表示元组t中相应于属性Ai的一个分量 。
(2)
(3)
(4)
传统的集合运算
①并(Union)关系R与关系S的并记作 R∪S = { t|t∈R∨t ∈S } 仍为n目关系,由属于R或属于S的元组组成
② 差(execpt)关系R与关系S的差记作 R -S = { t|t∈R∧t∉S } 仍为n目关系,由属于R而不属于S的所有元组组成
③交 关系R与关系S的交记作 R∩S = { t|t∈ R∧t ∈S }或者 R∩S = R –(R-S)仍为n目关系,由既属于R又属于S的元组组成
④ 笛卡尔积 广义笛卡尔积(Extended Cartesian Product)
专门的关系运算
1. 选择(Selection)
2. 投影(Projection)
3. 连接(Join)
关于连接的一些概念:
悬浮元祖( dangling tuple ) :两个关系R和S在做自然连接时,关系R中某些元 组有可能在S中不存在公共属性上值相等的元组 ,从而造成R中这些元组在操作时被舍弃了,这 些被舍弃的元组称为悬浮元组。
外连接 (OUTER JOIN)
如果把舍弃的元组也保存在结果关系中,而在其他 属性上填空值(Null),这种连接就叫做外连接。
左外连接(LEFT OUTER JOIN或LEFT JOIN)
如果只把左边关系R中要舍弃的元组保留就叫做左外连接
右外连接
如果只把右边关系S中要舍弃的元组保留就叫做右外连接(RIGHT OUTER JOIN或RIGHT JOIN)。
4. 除(Division)
(三)关系数据库标准语言SQL
3.1 SQL概述
概念补充:
SQL可以分为数据定义、数据查询、数据更新、数据控制四大部分。
基本表 :
本身独立存在的表,关系表,是实表
SQL中一个关系就对应一个基本表
一个(或多个)基本表对应一个存储文件
一个表可以带若干索引
存储文件 :
逻辑结构组成了关系数据库的内模式
物理结构是任意的,对用户透明
视图:
从一个或几个基本表导出的表;
数据库中只存放视图的定义而不存放视图对应的数据;
视图是一个虚表;
用户可以在视图上再定义视图 (例如,查询语句执行之后的结果);
3.2 数 据 定 义
3.2.1模式的定义与删除
定义模式
删除模式
3.2.2基本表
定义基本表
常用完整性约束
- 主码约束: PRIMARY KEY
- 唯一性约束:UNIQUE
- 非空值约束:NOT NULL
- 参照完整性约束
PRIMARY KEY与 UNIQUE的区别
PRIMARY KEY 可空,可以在一个表里的一个或多个字段定义;PRIMARY KEY 不可空不可重复,在一个表里可以定义联合主键;
简单的说,PRIMARY KEY =UNIQUE + NOT NULL
删除基本表
⑵ 删除属性列
直接/间接删除
- 把表中要保留的列及其内容复制到一个新表中
- 删除原表
- 再将新表重命名为原表名
直接删除属性列:(新)
例:ALTER TABLE Student Drop Scome;
ALTER TABLE Student MODIFY Sage SMALLINT;
注:修改原有的列定义有可能会破坏已有数据
修改基本表
表与模式
3.3 建立与删除索引
- 建立索引是加快查询速度的有效手段
- 建立索引
- DBA或表的属主(即建立表的人)根据需要建立
- 有些DBMS自动建立以下列上的索引: ①PRIMARY KEY ②UNIQUE
- 维护索引:DBMS自动完成
- 使用索引: DBMS自动选择是否使用索引以及使用哪些索引
建立索引
唯一值索引
聚簇索引&非聚簇索引
更新索引
删除索引
3.5 查 询
查询语句:
①SELECT子句:指定要显示的属性列
②FROM子句:指定查询对象(基本表或视图)
③ WHERE子句:指定查询条件
④ GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
⑤HAVING短语:筛选出只有满足指定条件的组
⑥ORDER BY子句:对查询结果表按指定列值的升序或降序排序
单表查询
查询仅涉及一个表,是一种最简单的查询操作
⑴ 选择表中的若干列
⑵ 选择表中的若干元组
⑶ 对查询结果排序
⑷ 使用集函数
⑸ 对查询结果分组
查询经过计算的值
SELECT子句的<目标列表达式>为表达式
①算术表达式 ②字符串常量 ③函数 ④列别名
二、选择表中的若干元组
- 消除取值重复的行:在SELECT子句中使用DISTINCT短语
- 查询满足条件的元组 :
WHERE子句常用的查询条件
(1) 比较大小
在WHERE子句的<比较条件>中使用比较运算符
-
- =,>,<,>=,<=,!= 或 <>,!>,!<,
- 逻辑运算符NOT + 比较运算符
(2) 确定范围
- 使用谓词 BETWEEN … AND …
NOT BETWEEN … AND …
(3) 确定集合
使用谓词 IN <值表>, NOT IN <值表>
<值表>:用逗号分隔的一组取值
(4) 字符串匹配
- [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词
用 != 或 < >运算符取代 NOT LIKE 谓词
通配符
-
% (百分号) 代表任意长度(长度可以为0)的字符串 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
-
_ (下横线) 代表任意单个字符 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'
ESCAPE '\'
(5) 涉及空值的查询
- 使用谓词 IS NULL 或 IS NOT NULL
- “IS NULL” 不能用 “= NULL” 代替
(6) 多重条件查询
用逻辑运算符AND和 OR来联结多个查询条件
- AND的优先级高于OR
- 可以用括号改变优先级
可用来实现多种其他谓词
- [NOT] IN
- [NOT] BETWEEN … AND …
三、对查询结果排序
使用ORDER BY子句
可以按一个或多个属性列排序: 升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
- ASC:排序列为空值的元组最后显示
- DESC:排序列为空值的元组最先显示
四、使用集函数
主要集函数
注:处COUNT(*) 外,都跳过空值只处理非空值。
五、对查询结果分组
使用GROUP BY子句 分组
细化集函数的作用对象
- 未对查询结果分组,集函数将作用于整个查询结果;对查询结果分组后,集函数将分别作用于每个组
- GROUP BY子句的作用对象是查询的中间结果表
- 分组方法:按指定的一列或多列值分组,值相等的为一组
- 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数
使用HAVING短语筛选最终输出结果
- 只有满足HAVING短语指定条件的组才输出
- HAVING短语与WHERE子句的区别:作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组 ②HAVING短语作用于组,从中选择满足条件的组。
连接查询
同时涉及多个表的查询称为连接查询
用来连接两个表的条件称为连接条件或连接谓词
连接操作的执行过程
- 嵌套循环法(NESTED-LOOP)
- 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
- 表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
- 重复上述操作,直到表1中的全部元组都处理完毕
排序合并法(SORT-MERGE)
索引连接(INDEX-JOIN)
对表2按连接字段建立索引;
对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组
SQL中连接查询的主要类型
-
- 广义笛卡尔积
- 等值连接(含自然连接)
- 非等值连接查询
- 自身连接查询
- 外连接查询
- 复合条件连接查询
一、广义笛卡尔积
- 不带连接谓词的连接
- 很少使用
二、等值与非等值连接查询
等值连接
- 连接运算符为 = 的连接操作
- [<表名1>.]<列名1> = [<表名2>.]<列名2>
- 任何子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属性名时可以加也可以省略表名前缀。
自然连接
- 等值连接的一种特殊情况,把目标列中重复的属性列去掉。
非等值连接查询
连接运算符 不是 = 的连接操作
三、自身连接
- 一个表与其自己进行连接,称为表的自身连接。
2.需要给表起别名以示区别。
3.由于所有属性名都是同名属性,因此必须使用别名前缀。
四、外连接(Outer Join)
外连接与普通连接的区别
① 普通连接操作只输出满足连接条件的元组
② 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
③在表名后面加外连接操作符(*)或(+)指定非主体表
④非主体表有一“万能”的虚行,该行全部由空值组成
⑤虚行可以和主体表中所有不满足连接条件的元组进行连接
⑥由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值
注意:
左外连接:外连接符出现在连接条件的左边 右外连接:外连接符出现在连接条件的右边
五、复合条件连接
WHERE子句中含多个连接条件时,称为复合条件连接
- 嵌套查询概述
- 一个SELECT-FROM-WHERE语句称为一个查询块
- 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
- 子查询的限制:不能使用ORDER BY子句
- 层层嵌套方式反映了 SQL语言的结构化
- 有些嵌套查询可以用连接运算替代
2. 不相关子查询
子查询的查询条件不依赖于父查询,是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
3.相关子查询
子查询的查询条件依赖于父查询
①首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表;②然后再取外层表的下一个元组;③重复这一过程,直至外层表全部检查完为止。
引出子查询的谓词
- 带有IN谓词的子查询
- 带有比较运算符的子查询
- 带有ANY或ALL谓词的子查询
- 带有EXISTS谓词的子查询
⒈带有IN谓词的子查询
⒉带有比较运算符的子查询
- 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。
- 与ANY或ALL谓词配合使用
⒊带有ANY或ALL谓词的子查询
谓词语义
ANY:任意一个值 ALL:所有值
需要配合使用比较运算符
> ANY | 大于子查询结果中的某个值 |
> ALL | 大于子查询结果中的所有值 |
< ANY | 小于子查询结果中的某个值 |
< ALL | 小于子查询结果中的所有值 |
>= ANY | 大于等于子查询结果中的某个值 |
>= ALL | 大于等于子查询结果中的所有值 |
<= ANY | 小于等于子查询结果中的某个值 |
<= ALL | 小于等于子查询结果中的所有值 |
= ANY | 等于子查询结果中的某个值 |
=ALL | 等于子查询结果中的所有值(通常没有实际意义) |
!=(或<>)ANY | 不等于子查询结果中的某个值 |
!=(或<>)ALL | 不等于子查询结果中的任何一个值 |
⒋带有EXISTS谓词的子查询
- 1. EXISTS谓词
- 存在量词
- 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
- 若内层查询结果非空,则外层的WHERE子句返回真值
- 若内层查询结果为空,则外层的WHERE子句返回假值
- 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
- 2. NOT EXISTS谓词
- 若内层查询结果非空,则外层的WHERE子句返回假值
- 若内层查询结果为空,则外层的WHERE子句返回真值
3. 不同形式的查询间的替换
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换
所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
5.用EXISTS/NOT EXISTS实现全称量词(难点)
-
- SQL语言中没有全称量词" (For all)
- 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
("x)P ≡ Ø ($ x(Ø P))
6. 用EXISTS/NOT EXISTS实现逻辑蕴函(难点)
- SQL语言中没有蕴函(Implication)逻辑运算
- 可以利用谓词演算将逻辑蕴函谓词等价转换为:
p ® q ≡ Ø p∨q
3.3.5 集合查询
标准SQL直接支持的集合操作种类:并操作(UNION)
一般商用数据库支持的集合操作种类
并操作(UNION)
交操作(INTERSECT)
差操作(MINUS)
1. 并操作
- 形式 <查询块> UNION <查询块>
注意:参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同
2. 交操作
标准SQL中没有提供集合交操作,但可用其他方法间接实现。
3. 差操作
4. 对集合操作结果的排序
- ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序
- 任何情况下,ORDER BY子句只能出现在最后
- 对集合操作结果排序时,ORDER BY子句中用数字指定排序属性
3.4 数据更新
3.4.1 插入数据
2. 插入子查询结果
3.4.2 修改数据
三种修改方式
- 修改某一个元组的值
- 修改多个元组的值
- 带子查询的修改语句
UPDATE SC
SET Grade=0
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
SET子句 指定修改方式
要修改的列
修改后取值
WHERE子句 指定要修改的元组
缺省表示要修改表中的所有元组
DBMS在执行修改语句时会检查修改操作
是否破坏表上已定义的完整性规则
-
- 实体完整性
- 主码不允许修改
- 用户定义的完整性
- NOT NULL约束
- UNIQUE约束
- 值域约束
DELETE
FROM <表名>
[WHERE <条件>];
- 功能
- 删除指定表中满足WHERE子句条件的元组
- WHERE子句
- 指定要删除的元组
- 缺省表示要修改表中的所有元组
- 三种删除方式
- 删除某一个元组的值
- 删除多个元组的值
- 带子查询的删除语句
DBMS在执行插入语句时会检查所插元组
是否破坏表上已定义的完整性规则
- 参照完整性
- 不允许删除
- 级联删除
更新数据与数据一致性
DBMS在执行插入、删除、更新语句时必须保证数据库一致性
- 必须有事务的概念和原子性
- 完整性检查和保证
3.5 视 图
视图的特点
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不会出现数据冗余
- 基表中的数据发生变化,从视图中查询出的数据也随之改变
基于视图的操作
- 查询
- 删除
- 受限更新
- 定义基于该视图的新视图
1. 建立视图
DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。组成视图的属性列名全部省略或全部指定。
省略:
由子查询中SELECT目标列中的诸字段组成明确指定视图的所有列名:
(1) 某个目标列是集函数或列表达式
(2) 目标列为 *
(3) 多表连接时选出了几个同名列作为视图的字段
(4) 需要在视图中为某个列启用新的更合适的名字
WITH CHECK OPTION
透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式)带表达式的视图。
定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2000-Sage
FROM Student
设置一些派生属性列, 也称为虚拟列--Sbirth
带表达式的视图必须明确定义组成视图的各个属性列名
一类不易扩充的视图:以 SELECT * 方式创建的视图可扩充性差,应尽可能避免
2. 删除视图
3.5.2 查询视图
- 从用户角度:查询视图与查询基本表相同
- DBMS实现视图查询的方法
- 实体化视图(View Materialization)
- 有效性检查:检查所查询的视图是否存在
- 执行视图定义,将视图临时实体化,生成临时表
- 查询视图转换为查询临时表
- 查询完毕删除被实体化的视图(临时表)
- 视图消解法(View Resolution)
- 进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义
- 把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询
- 执行修正后的查询
- 实体化视图(View Materialization)
3.5.3 更新视图
- 用户角度:更新视图与更新基本表相同
- DBMS实现视图更新的方法
- 视图实体化法(View Materialization)
- 视图消解法(View Resolution)
- 指定WITH CHECK OPTION子句后
DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新
更新视图的限制
- 一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新(对两类方法均如此)
- 允许对行列子集视图进行更新
- 对其他类型视图的更新不同系统有不同限制
3.5.4 视图的作用
(四)数据库安全性
4.1授权
4.2 收回权限
数据控制亦称为数据保护,包括数据的:
- 安全性控制
- 完整性控制
- 并发控制
- 恢复
SQL语言的数据控制功能
SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的完全性、完整性,并提供了一定的并发控制及恢复能力。
1. 完整性
- 数据库的完整性是指数据库中数据的正确性与相容性。
- SQL语言定义完整性约束条件
CREATE TABLE语句
ALTER TABLE语句
- 码
- 其他约束条件
- 参照完整性
- 取值唯一的列
2. 并发控制
- 并发控制: 当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。
- SQL语言并发控制能力: 提供事务、事务开始、事务结束、提交等概念
3. 恢复
- 恢复: 当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致状态的功能。
- SQL语言恢复功能:提供事务回滚、重做等概念 (UNDO、REDO)
4. 安全性
- 安全性:保护数据库,防止不合法的使用所造成的数据泄露和破坏。
- 保证数据安全性的主要措施
存取控制:控制用户只能存取他有权存取的数据
规定不同用户对于不同数据对象所允许执行的操作
DBMS实现数据安全性保护的过程
- 用户或DBA把授权决定告知系统
- SQL的GRANT和REVOKE
- DBMS把授权的结果存入数据字典
- 当用户提出操作请求时,DBMS根据授权定义进行检查,以决定是否执行操作请求
41 授 权
- GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
- 谁定义?DBA和表的建立者(即表的属主)
- REVOKE功能:将对指定操作对象的指定操作权限授予指定的用户。
(1) 操作权限
对象 | TABLE | 操作权限 |
属性列 | TABLE | SELECT ,INSERT,UPDATE DELECT,ALL PIVIEGES |
视图 | TABLE | SELECT ,INSERT,UPDATE DELECT,ALL PIVIEGES |
基本表 | TABLE | SELECT ,INSERT,UPDATE DELECT ,ALTER ,INDEX,ALL PIVIEGES |
数据库 | DATABASE | CREATETAB |
(2) 用户的权限
- 建表(CREATETAB)的权限:属于DBA
- DBA授予-->普通用户
- 基本表或视图的属主拥有对该表或视图的一切操作权限
- 接受权限的用户:
一个或多个具体用户
PUBLIC(全体用户)
(3) WITH GRANT OPTION子句
- 指定了WITH GRANT OPTION子句:
获得某种权限的用户还可以把这种权限再授予别的用户。
2.没有指定WITH GRANT OPTION子句:
获得某种权限的用户只能使用该权限,不能传播该权限
查询Student表权限授给用户U1
GRANT SELECT
ON TABLE Student
TO U1;
把对Student表和Course表的全部权限授予用户U2和U3
GRANT ALL PRIVILIGES
ON TABLE Student, Course
TO U2, U3;
4.2 收回权限
- REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
功能:从指定用户那里收回对指定对象的指定权限
第4章 数据库安全性
数据库系统的安全保护措施是否有效是数据库系统主要的性能指标之一
4.1 计算机安全性概论
什么是计算机系统安全性
为计算机系统建立和采取的各种安全保护措施,以保护计算机系统中的硬件、软件及数据,防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等。
技术安全
指计算机系统中采用具有一定安全性的硬件、软件来实现对计算机系统及其所存数据的安全保护,当计算机系统受到无意或恶意的攻击时仍能保证系统正常运行,保证系统内的数据不增加、不丢失、不泄露。
管理安全
软硬件意外故障、场地的意外事故、管理不善导致的计算机设备和数据介质的物理破坏、丢失等安全问题
政策法律类
政府部门建立的有关计算机犯罪、数据安全保密的法律道德准则和政策法规、法令。
安全标准简介
发展历史:
安全标准简介
TCSEC/TDI安全级别划分
- R1 安全策略(Security Policy)
R1.1 自主存取控制 (Discretionary Access Control,简记为DAC)
R1.2 客体重用(Object Reuse)
R1.3 标记(Labels)
R1.4 强制存取控制(Mandatory Access Control,简记为MAC)
2.R2 责任(Accountability)
R2.1 标识与鉴别(Identification & Authentication)
R2.2 审计(Audit)
3.R3 保证(Assurance)
R3.1 操作保证(Operational Assurance)
R3.2 生命周期保证(Life Cycle Assurance)
R4 文档(Documentation)
R4.1 安全特性用户指南(Security Features User's Guide)
R4.2 可信设施手册(Trusted Facility Manual)
R4.3 测试文档(Test Documentation)
R4.4 设计文档(Design Documentation)
CC评估保证级划分
数据库安全性控制
- 数据库安全性控制的常用方法
- 用户标识和鉴定
- 存取控制
- 视图
- 审计
- 密码存储
用户标识与鉴别
- 用户标识与鉴别(Identification & Authentication)
系统提供的最外层安全保护措施
基本方法
- 系统提供一定的方式让用户标识自己的名字或身份;
- 系统内部记录着所有合法用户的标识;
- 每次用户要求进入系统时,由系统核对用户提供的身份标识;
- 通过鉴定后才提供机器使用权。
- 用户标识和鉴定可以重复多次
存取控制
- 存取控制机制的功能
- 存取控制机制的组成
- 定义存取权限
- 检查存取权限
- 存取控制机制的组成
用户权限定义和合法权检查机制一起组成了DBMS的安全子系统
常用存取控制方法
自主存取控制的特点
- 同一用户对于不同的数据对象有不同的存取权限
- 不同的用户对同一对象也有不同的权限
- 用户还可将其拥有的存取权限转授给其他用户
强制存取控制的特点
- 每一个数据对象被标以一定的密级
- 每一个用户也被授予某一个级别的许可证
- 对于任意一个对象,只有具有合法许可证的用户才可以存取
自主存取控制方法
授权与回收
回收:
SQL灵活的授权机制
关系数据库中授权的数据对象粒度
- 行
- 属性列
- 表
- 数据库
强制存取控制方法
什么是强制存取控制
-
- 强制存取控制(MAC)是指系统为保证更高程度的安全性,按照TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段。
- MAC不是用户能直接感知或进行控制的。
- 主体与客体
- 在MAC中,DBMS所管理的全部实体被分为主体和客体两大类
- 主体是系统中的活动实体
- DBMS所管理的实际用户
- 代表用户的各进程
- 客体是系统中的被动实体,是受主体操纵的
- 文件
- 基表
- 索引
- 视图
视图机制
- 视图机制与授权机制配合使用:
- 首先用视图机制屏蔽掉一部分保密数据
- 视图上面再进一步定义存取权限
- 间接实现了支持存取谓词的用户权限定义
审计
审计的定义
审计功能的可选性:①审计很费时间和空间 ②DBA可以根据应用对安全性的要求,灵活地打开或关闭审计功能。
4.2.8 数据加密
- 加密方法
- 替换方法
- 使用密钥(Encryption Key)将明文中的每一个字符转换为密文中的一个字符
- 置换方法
- 将明文的字符按不同的顺序重新排列
- 混合方法
- 替换方法
美国1977年制定的官方加密标准:数据加密标准(Data Encryption Standard,简称DES)
4.3 统计数据库安全性
- 统计数据库的特点
- 允许用户查询聚集类型的信息(例如合计、平均值等)
- 不允许查询单个记录信息
规则1:任何查询至少要涉及N(N足够大)个以上的记录
规则2:任意两个查询的相交数据项不能超过M个
规则3:任一用户的查询次数不能超过1+(N-2)/M
第五章 数据库完整性
什么是数据库的完整性
-
- 数据的正确性和相容性
- 防止不合语义的数据进入数据库。
完整性约束条件定义
- 完整性约束条件:数据模型的组成部分约束数据库中数据的语义
- DBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中
完整性约束条件作用的对象
- 列:对属性的取值类型、范围、精度等的约束条件
- 元组:对元组中各个属性列间的联系的约束
- 关系:对若干元组间、关系集合上以及关系之间的联系的约束
- 静态
- 对静态对象的约束是反映数据库状态合理性的约束
- 动态
- 对动态对象的约束是反映数据库状态变迁的约束
1. 静态列级约束
- 静态列级约束:对的取值域的说明
- 最常见、最简单、最容易实现的一类完整性约束
五类静态列级约束
1) 数据类型约束:数据的类型、长度、单位、精度等
2) 对数据格式的约束
3) 取值范围或取值集合的约束
4) 对空值的约束
5) 其他约束
2. 静态元组约束
规定元组的各个列之间的约束关系
静态元组约束只局限在元组上
3. 静态关系约束
关系的各个元组之间或若干关系之间存在的各种联系或约束
常见静态关系约束:
1) 实体完整性约束
2) 参照完整性约束
3) 函数依赖约束
4) 统计约束
4. 动态列级约束
动态列级约束是修改列定义或列值时应满足的约束条件
1) 修改列定义时的约束
2) 修改列值时的约束
5. 动态元组约束
修改元组值: 各个字段之间要满足的约束条件
6. 动态关系约束
关系变化前后状态:限制条件
粒 度 状态 | 列 级 | 元 组 级 | 关 系 级 |
静 态 | 列定义 ·类型 ·格式 ·值域 ·空值 | 元组值应满足的条件 | 实体完整性约束 参照完整性约束 函数依赖约束 统计约束 |
动 态 | 改变列定义或列值 | 元组新旧值之间应满足的约束条件 | 关系新旧状态间应满足的约束条件 |
10.2 完整性控制
一、DBMS的完整性控制机制
1. 定义功能
一个完善的完整性控制机制应该允许用户定义各类完整性约束条件。
2. 检查功能
- 立即执行的约束(Immediate constraints)
语句执行完后立即检查是否违背完整性约束
- 延迟执行的约束(Deferred constrainsts)
完整性检查延迟到整个事务执行结束后进行
3. 违约反应
拒绝该操作; 其他处理方法
完整性规则五元组表示:
(D,O,A,C,P)
- D(Data) 约束作用的数据对象;
- O(Operation) 触发完整性检查的数据库操作
当用户发出什么操作请求时需要检查该完整性规则
是立即检查还是延迟检查;
3.A(Assertion) 数据对象必须满足的断言或语义约束这是规则的主体;
4. C(Condition) 选择A作用的数据对象值的谓词;
5. P(Procedure) 违反完整性规则时触发的过程。
1. 外码是否可以接受空值的问题
- 外码是否能够取空值:依赖于应用环境的语义
2.在被参照关系中删除元组时的问题
出现违约操作的情形:
删除被参照关系的某个元组(student)
而参照关系有若干元组(SC)的外码值与被删除的被参照关系的主码值相同
- 违约反应:可有三种策略
- 级联删除(CASCADES)
- 受限删除(RESTRICTED)
- 置空值删除(NULLIFIES)
3.在参照关系中插入元组时的问题
- 受限插入
- 仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。
- 递归插入
- 首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。
4. 修改被参照关系中主码的问题
- 两种策略
(1)不允许修改主码
(2)允许修改主码
第六章 关系数据理论
二、关系模式的形式化定义
关系模式由五部分组成,即它是一个五元组:
R(U, D, DOM, F)
R: 关系名
U: 组成该关系的属性名集合
D: 属性组U中属性所来自的域
DOM:属性向域的映象集合
F: 属性间数据的依赖关系集合
三、什么是数据依赖
1. 完整性约束的表现形式
- 限定属性取值范围:
- 定义属性值间的相互关连(主要体现于值的相等与否),这就是数据依赖,它是数据库模式设计的关键
2. 数据依赖
- 是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
3. 数据依赖的类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multivalued Dependency,简记为MVD)
- 其他
四、关系模式的简化表示
- 关系模式R(U, D, DOM, F)
简化为一个三元组:
R(U, F)
- 当且仅当U上的一个关系r 满足F时,r称为关系模式 R(U, F)的一个关系
五、数据依赖对关系模式的影响
⒈ 数据冗余太大
浪费大量的存储空间
例:每一个系主任的姓名重复出现
⒉ 更新异常(Update Anomalies)
数据冗余 ,更新数据时,维护数据完整性代价大。
例:某系更换系主任后,系统必须修改与该系学生有关的每一个元组
⒊ 插入异常(Insertion Anomalies)
该插的数据插不进去
例,如果一个系刚成立,尚无学生,我们就无法把这个系及其系主任的信息存入数据库。
⒋ 删除异常(Deletion Anomalies)
不该删除的数据不得不删
原因:由存在于模式中的某些数据依赖引起的
解决方法:通过分解关系模式来消除其中不合适的数据依赖。
6.2 规范化
6.2.1 函数依赖
一、函数依赖
R的所有关系实例均要满足:
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立,若有同名,则年龄不依赖于姓名。
3. 数据库设计者可以对现实世界作强制的规定。
二、平凡函数依赖与非平凡函数依赖
在关系SC(Sno, Cno, Grade)中,
非平凡函数依赖: (Sno, Cno) → Grade
平凡函数依赖: (Sno, Cno) → Sno
(Sno, Cno) → Cno
三、完全函数依赖与部分函数依赖
四、传递函数依赖
码
外码:
6.2.3 范式
范式是符合某一种级别的关系模式的集合 ;关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式;某一关系模式R为第n范式,可简记为R∈nNF。
1NF的定义
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
注意:第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
(1) 插入异常
(2) 删除异常
(3) 数据冗余度大
(4) 修改复杂
2NF的定义
定义5.6 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
3NF的定义
5.2.6 BC范式(BCNF)
- 定义5.9 设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。
若R∈BCNF
- 每一个决定属性集(因素)都包含(候选)码
- R中的所有属性(主,非主属性)都完全函数依赖于码
- R∈3NF(证明)
- 若R∈3NF 则 R不一定∈BCNF
5.2.5 多值依赖与第四范式(4NF)
定义6.10 第四范式
多值依赖
多值依赖的性质
多值依赖与函数依赖区别
规范化小结
第七章 数据库设计
- 数据库设计
- 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)
- 在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。
7.1.1 数据库和信息系统
- 数据库是信息系统的核心和基础
- 把信息系统中大量的数据按一定的模型组织起来
- 提供存储、维护、检索数据的功能
- 使信息系统可以方便、及时、准确地从数据库中获得所需的信息
- 数据库是信息系统的各个部分能否紧密地结合在一起以及如何结合的关键所在
- 数据库设计是信息系统开发和建设的重要组成部分
7.1.2 数据库设计的特点
- 数据库建设是硬件、软件和干件的结合
- 三分技术,七分管理,十二分基础数据
- 技术与管理的界面称之为“干件”
2.数据库设计应该与应用系统设计相结合
- 结构(数据)设计:设计数据库框架或数据库结构
- 行为(处理)设计:设计应用程序、事务处理等.
3. 结构和行为分离的设计
- 传统的软件工程忽视对应用中数据语义的分析和抽象,只要有可能就尽量推迟数据结构设计的决策
- 早期的数据库设计致力于数据模型和建模方法研究,忽视了对行为的设计
数据库设计的基本步骤
⒈需求分析阶段
- 准确了解与分析用户需求(包括数据与处理)
- 是整个设计过程的基础,是最困难、最耗费时间的一步
⒉概念结构设计阶段
- 是整个数据库设计的关键
- 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型
⒊逻辑结构设计阶段
- 将概念结构转换为某个DBMS所支持的数据模型
- 对其进行优化
⒋数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
⒌数据库实施阶段
- 运用DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果
- 并进行试运行
- 组织数据入库
- 编制与调试应用程序
- 建立数据库
⒍数据库运行和维护阶段
- 数据库应用系统经过试运行后即可投入正式运行。
- 在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
数据库各级模式的形成过程
1. 需求分析阶段
2.概念设计阶段
3.逻辑设计阶段
4.物理设计阶段
5.数据库实施阶段
6.运行和维护阶段
数据库设计不同阶段形成的数据库各级模式
特点:
然后根据用户处理的要求、安全性的考虑,在基本表的基础上再建立必要的视图(View),形成数据的外模式。首先将E-R图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式。根据DBMS特点和处理的需要,进行物理存储安排,建立索引,形成数据库内模式需。求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
一、数据字典的用途
数据字典是关于数据库中数据的描述,即元数据, 不是数据本身,是数据的数据 ; 数据字典在需求分析阶段建立,在数据库设计过程 中不断修改、充实、完善;数据字典是进行详细的数据收集和数据分析所获得 的主要结果。
- 数据字典是各类数据描述的集合
- 数据字典是进行详细的数据收集和数据分析所获得的主要结果
二、数据字典的内容
- 数据字典的内容
- 数据项
- 数据结构
- 数据流
- 数据存储
- 处理过程
- 数据项是数据的最小组成单位
- 若干个数据项可以组成一个数据结构
- 数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。
⒈ 数据项
⒉ 数据结构
- 数据结构反映了数据之间的组合关系。
- 一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。
- 对数据结构的描述
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
⒊ 数据流
⒋ 数据存储
⒌ 处理过程
6.3 概念结构设计
- 概念结构设计
- 需求分析阶段描述的用户应用需求是现实世界的具体需求
- 将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计
- 概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定。
- 概念结构设计是整个数据库设计的关键
7.3.2 概念结构设计的方法与步骤
- 设计概念结构的四类方法
- 自顶向下
- 自底向上
- 逐步扩张
- 混合策略
7.3.3 数据抽象与局部视图设计
一、数据抽象
- 概念结构是对现实世界的一种抽象
- 从实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节
- 把这些特性用各种概念精确地加以描述
- 这些概念组成了某种模型
2. 三种常用抽象
1. 分类(Classification)
-
- 定义某一类概念作为现实世界中一组对象的类型
- 这些对象具有某些共同的特性和行为
- 它抽象了对象值和型之间的“is member of”的语义
- 在E-R模型中,实体型就是这种抽象
2. 聚集(Aggregation)
-
- 定义某一类型的组成成分
- 它抽象了对象内部类型和成分之间“is part of”的语义
- 在E-R模型中若干属性的聚集组成了实体型,就是这种抽象
3. 概括(Generalization)
-
- 定义类型之间的一种子集联系
- 它抽象了类型之间的“is subset of”的语义
- 概括有一个很重要的性质:继承性。子类继承超类上定义的所有抽象。
设计分E-R图的步骤:
⒈选择局部应用
⒉逐一设计分E-R图
- 一般原则
- 属性不能与其他实体具有联系。联系只发生在实体之间。
- 属性不能再具有需要描述的性质。即属性必须是不可分的数据项,不能再由另一些属性组成。
- 符合上述两条特性的事物一般作为属性对待。
- 为了简化E-R图的处置,现实世界中的事物凡能够作为属性对待的,应尽量作为属性。
- 集成局部E-R图的步骤
1. 合并
⒈ 属性冲突
- 两类属性冲突
- 属性域冲突:属性值的类型、取值范围或取值集合不同。
- 属性取值单位冲突。
⒉ 命名冲突
同名异义:不同意义的对象在不同的局部应用中具有相同的名字
异名同义(一义多名):同一意义的对象在不同的局部应用中具有不同的名字
⒊ 结构冲突
同一对象在不同应用中具有不同的抽象
同一实体在不同局部视图中所包含的属性不完全相同,或者属性的排列次序不完全相同。
实体之间的联系在不同局部视图中呈现不同的类型
2. 修改与重构
- 概念结构设计的步骤
- 抽象数据并设计局部视图
- 集成局部视图,得到全局概念结构
- 验证整体概念结构
- 设计局部视图
- ⒈ 选择局部应用
- ⒉ 逐一设计分E-R图
- 标定局部应用中的实体、属性、码,实体间的联系
- 用E-R图描述出来
- 集成局部视图
- 1.合并分E-R图,生成初步E-R图
- 消除冲突
- 属性冲突
- 命名冲突
- 结构冲突
- 消除冲突
- 2. 修改与重构
- 消除不必要的冗余,设计生成基本E-R图
- 分析方法
- 规范化理论
- 消除不必要的冗余,设计生成基本E-R图
- 1.合并分E-R图,生成初步E-R图
6.4 逻辑结构设计
- 逻辑结构设计的任务
- 概念结构是各种数据模型的共同基础
- 为了能够用某一DBMS实现用户需求,还必须将概念结构进一步转化为相应的数据模型,这正是数据库逻辑结构设计所要完成的任务。
- 逻辑结构设计的步骤
- 将概念结构转化为一般的关系、网状、层次模型
- 将转化来的关系、网状、层次模型向特定DBMS支持下的数据模型转换
- 对数据模型进行优化
- 转换原则
⒈ 一个实体型转换为一个关系模式。
- 关系的属性:实体型的属性
- 关系的码:实体型的码
⒉ 一个m:n联系转换为一个关系模式。
- 关系的属性:与该联系相连的各实体的码以及联系本身的属性
- 关系的码:各实体码的组合
⒊ 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
转换为一个独立的关系模式:
- 关系的码:n端实体的码
- 关系的属性:与该联系相连的各实体的码以及联系本身的属性
与n端对应的关系模式合并
- 合并后关系的码:不变
- 合并后关系的属性:在n端关系中加入1端关系的码和联系本身的属性
- 可以减少系统中的关系个数,一般情况下更倾向于采用这种方法
4 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
转换为一个独立的关系模式
- 关系的候选码:每个实体的码均是该关系的候选码
- 关系的属性:与该联系相连的各实体的码以及联系本身的属性
与某一端对应的关系模式合并
- 合并后关系的属性:加入对应关系的码和联系本身的属性
- 合并后关系的码:不变
⒌ 三个或三个以上实体间的一个多元联系转换为一个关系模式。
- 关系的属性:与该多元联系相连的各实体的码以及联系本身的属性
- 关系的码:各实体码的组合
⒍ 同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。
⒎ 具有相同码的关系模式可合并。
- 目的:减少系统中的关系个数。
- 合并方法:将其中一个关系模式的全部属性加入到另一个关系模式中,然后去掉其中的同义属性(可能同名也可能不同名),并适当调整属性的次序。
7.4.2 向特定DBMS规定的模型进行转换
- 一般的数据模型还需要向特定DBMS规定的模型进行转换。
- 转换的主要依据是所选用的DBMS的功能及限制。没有通用规则。
- 对于关系模型来说,这种转换通常都比较简单。
7.4.3 数据模型的优化
- 数据库逻辑设计的结果不是唯一的。
- 得到初步数据模型后,还应该适当地修改、调整数据模型的结构,以进一步提高数据库应用系统的性能,这就是数据模型的优化。
- 关系数据模型的优化通常以规范化理论为指导。
数据模型的优化
⒈ 确定数据依赖
⒉ 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
⒊ 按照数据依赖的理论对关系模式逐一进行分析,考查是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。
⒋ 按照需求分析阶段得到的各种应用对数据处理的要求,分析对于这样的应用环境这些模式是否合适,确定是否要对它们进行合并或分解。
⒌ 按照需求分析阶段得到的各种应用对数据处理的要求,对关系模式进行必要的分解或合并,以提高数据操作的效率和存储空间的利用率
水平分解
垂直分解
逻辑结构设计小结
E-R图向关系模型的转换原则
⒈ 一个实体型转换为一个关系模式。
⒉ 一个m:n联系转换为一个关系模式。
⒊ 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
⒋ 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
⒌ 三个或三个以上实体间的一个多元联系转换为一个关系模式。
⒍ 同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。
⒎ 具有相同码的关系模式可合并。
优化数据模型的方法
⒈ 确定数据依赖
⒉ 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
⒊ 确定各关系模式分别属于第几范式。
⒋ 分析对于应用环境这些模式是否合适,确定是否要对它们进行合并或分解。
⒌ 对关系模式进行必要的分解或合并
7.5 数据库的物理设计
定义: 数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于选定的数据库管理系统,为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计。
关系模式存取方法选择
- DBMS常用存取方法
- 索引方法,目前主要是B+树索引方法
- 聚簇(Cluster)方法
- HASH方法
一、索引存取方法的选择
- 选择索引存取方法的主要内容
根据应用要求确定
-
- 对哪些属性列建立索引
- 对哪些属性列建立组合索引
- 对哪些索引要设计为唯一索引
- 聚簇索引
- 建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中元组的物理顺序一致。
7.6 数据库的实施
一、定义数据库结构
- 确定了数据库的逻辑结构与物理结构后,就可以用所选用的DBMS提供的数据定义语言(DDL)来严格描述数据库结构。
二、数据装载
- 数据库结构建立好后,就可以向数据库中装载数据了。组织数据入库是数据库实施阶段最主要的工作。
- 数据装载方法
- 人工方法
- 计算机辅助数据入库
数据库各级模式的形成
第八章 数据库编程
嵌 入 式 SQL:高级程序语言中嵌入SQL
3.7.1嵌入式SQL的一般形式
- 为了区分SQL语句与主语言语句,需要:
- 前缀:EXEC SQL
- 结束标志:随主语言的不同而不同
- 以C为主语言的嵌入式SQL语句的一般形式
EXEC SQL <SQL语句>;
DBMS处理宿主型数据库语言SQL 的方法
- 预编译
- 修改和扩充主语言使之能处理SQL语句
预编译
1.由DBMS的预处理程序对源程序进行扫描,识别出SQL语句
2.把它们转换成主语言调用语句,以使主语言编译程序能识别它
3.最后由主语言的编译程序将整个源程序编译成目标码。
嵌入SQL语句
说明性语句
嵌入SQL语句 数据定义
可执行语句 数据控制
数据操纵
- 允许出现可执行的高级语言语句的地方,都可以写可执行SQL语句
- 允许出现说明语句的地方,都可以写说明性SQL语句
3.7.2 嵌入式SQL语句与主语言之间的通信
将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句
- SQL语句
- 负责操纵数据库
- 描述性的面向集合的语句
- 高级语言语句: 过程性的面向记录的语句 负责控制程序流程
工作单元之间的通信方式
1. SQL通信区
向主语言传递SQL语句的执行状态信息
主语言能够据此控制程序流程
2. 主变量
1)主语言向SQL语句提供参数
2)将SQL语句查询数据库的结果交主语言进一步处理
3. 游标
解决集合性操作语言与过程性操作语言的不匹配
- 为什么要使用游标
- SQL语言与主语言具有不同数据处理方式
- SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录
- 主语言是面向记录的,一组主变量一次只能存放一条记录
- 仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求
- 嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式
- 什么是游标
- 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
- 每个游标区都有一个名字
- 用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
- 使用游标的步骤
- 1. 说明游标
- 2. 打开游标
- 3. 移动游标指针,然后取当前记录
- 4. 关闭游标
1. 说明游标
- 使用DECLARE语句
- 语句格式
EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;
功能:是一条说明性语句,这时DBMS并不执行SELECT指定的查询操作。
2. 打开游标
- 使用OPEN语句
- 语句格式
EXEC SQL OPEN <游标名>;
- 功能
- 打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中
- 这时游标处于活动状态,指针指向查询结果集中第一条记录之前
3. 移动游标指针,然后取当前记录
- 使用FETCH语句
- 语句格式
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <游标名>
INTO <主变量>[<指示变量>]
[,<主变量>[<指示变量>]]...;
- 功能
- 指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。
- NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。
- NEXT:向前推进一条记录
- PRIOR:向回退一条记录
- FIRST:推向第一条记录
- LAST:推向最后一条记录
- 缺省值为NEXT
- 说明
- (1) 主变量必须与SELECT语句中的目标列表达式具有一一对应关系
- (2) FETCH语句通常用在一个循环结构中,通过循环执行FETCH语句逐条取出结果集中的行进行处理
- (3) 为进一步方便用户处理数据,现在一些关系数据库管理系统对FETCH语句做了扩充,允许用户向任意方向以任意步长移动游标指针
4. 关闭游标
- 使用CLOSE语句
- 语句格式
EXEC SQL CLOSE <游标名>;
- 功能
- 关闭游标,释放结果集占用的缓冲区及其他资源
- 说明
- 游标被关闭后,就不再和原来的查询结果集相联系
- 被关闭的游标可以再次被打开,与新的查询结果相联系
第八章 数据库恢复技术
- 数据库系统中的数据是由DBMS统一管理和控制的,为了适应数据共享的环境,DBMS必须提供数据保护能力,以保证数据库中数据的安全可靠和正确有效。
7.1 事务的基本概念
- 事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
- 事务和程序是两个概念
- 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
- 一个应用程序通常包含多个事务
- 事务是恢复和并发控制的基本单位
一、什么是事务
- 事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
- 事务和程序是两个概念
- 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
- 一个应用程序通常包含多个事务
- 事务是恢复和并发控制的基本单位
二、如何定义事务
- 显式定义方式
BEGIN TRANSACTION BEGIN TRANSACTION
SQL 语句1 SQL 语句1
SQL 语句2 SQL 语句2
。。。。。 。。。。。
COMMIT ROLLBACK
- 隐式方式
当用户没有显式地定义事务时,
DBMS按缺省规定自动划分事务
事务结束
COMMIT
事务正常结束
提交事务的所有操作(读+更新)
事务中所有对数据库的更新永久生效
ROLLBACK
事务异常终止
-
- 事务运行的过程中发生了故障,不能继续执行
回滚事务的所有更新操作
-
- 事务滚回到开始时的状态
三、事务的特性(ACID特性)
事务的ACID特性:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持续性(Durability )
1. 原子性
- 事务是数据库的逻辑工作单位
- 事务中包括的诸操作要么都做,要么都不做
2. 一致性
事务执行的结果必须是使数据库从一个
一致性状态变到另一个一致性状态
一致性状态:
数据库中只包含成功事务提交的结果
不一致状态:
数据库中包含失败事务的结果
3. 隔离性
对并发执行而言
一个事务的执行不能被其他事务干扰
- 一个事务内部的操作及使用的数据对其他并发事务是隔离的
- 并发执行的各个事务之间不能互相干扰
4. 持续性
- 持续性也称永久性(Permanence)
- 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
- 接下来的其他操作或故障不应该对其执行结果有任何影响。
事务的特性
- 保证事务ACID特性是事务处理的任务
- 破坏事务ACID特性的因素
- 多个事务并行运行时,不同事务的操作交叉执行
- 事务在运行过程中被强行停止
系统故障的恢复
- 清除尚未完成的事务对数据库的所有修改
- 系统重新启动时,恢复程序要强行撤消(UNDO)所有未完成事务
- 将缓冲区中已完成事务提交的结果写入数据库
- 系统重新启动时,恢复程序需要重做(REDO)所有已提交的事务
恢复机制涉及的关键问题
1. 如何建立冗余数据
-
-
- 数据转储(backup)
- 登录日志文件(logging)
-
2. 如何利用这些冗余数据实施数据库恢复
1.静态转储
- 在系统中无运行事务时进行转储
- 转储开始时数据库处于一致性状态
- 转储期间不允许对数据库的任何存取、修改活动
- 优点:实现简单
- 缺点:降低了数据库的可用性
- 转储必须等用户事务结束
- 新的事务必须等转储结束
动态转储
- 转储操作与用户事务并发进行
- 转储期间允许对数据库进行存取或修改
- 优点
- 不用等待正在运行的用户事务结束
- 不会影响新事务的运行
- 动态转储的缺点
- 不能保证副本中的数据正确有效
7.4.2 登记日志文件
一、日志文件的内容
1. 什么是日志文件
日志文件(log)是用来记录事务对数据库的
更新操作的文件
2. 日志文件的格式
以记录为单位的日志文件
以数据块为单位的日志文件
3. 日志文件内容
-
- 各个事务的开始标记(BEGIN TRANSACTION)
- 各个事务的结束标记(COMMIT或ROLLBACK)
- 各个事务的所有更新操作
- 与事务有关的内部更新操作
日志文件中的一个日志记录 (log record)
4. 基于记录的日志文件
每条日志记录的内容
-
- 事务标识
- 操作类型(插入、删除或修改)
- 操作对象(记录ID、Block NO.)
- 更新前数据的旧值(对插入操作而言,此项为空值)
- 更新后数据的新值(对删除操作而言, 此项为空值)
5. 基于数据块的日志文件
每条日志记录的内容
-
- 事务标识(标明是那个事务)
- 操作对象(记录ID、Block NO.)
- 更新前数据所在的整个数据块的值(对插入操作而言,此项为空值)
- 更新后整个数据块的值(对删除操作而言, 此项为空值)
- 常用恢复技术
- 事务故障的恢复
- UNDO
- 系统故障的恢复
- UNDO + REDO
- 介质故障的恢复
- 重装备份并恢复到一致性状态 + REDO
- 事务故障的恢复
(九)关系数据理论
6.1 关系系统
- 能够在一定程度上支持关系模型的数据库管理系统是关系系统。
- 由于关系模型中并非每一部分都是同等重要的
- 并不苛求一个实际的关系系统必须完全支持关系模型。
- 关系数据结构
- 域及域上定义的关系
- 关系操作
- 并、交、差、广义笛卡尔积、选择、投影、连接、除等
- 关系完整性
- 实体完整性、参照完整性、用户自己定义的完整性
一个数据库管理系统可定义为关系系统,当且仅当它至少支持:
1. 关系数据库(即关系数据结构)
系统中只有表这种结构
2. 支持选择、投影和(自然)连接运算
对这些运算不要求用户定义任何物理存取路径
对关系系统的最低要求
6.2 关系系统的查询优化
6.2.1 查询优化概述
- 查询优化的必要性
- 查询优化极大地影响RDBMS的性能。
- 查询优化的可能性
- 关系数据语言的级别很高,使DBMS可以从关系表达式中分析查询语义。
- 用户不必考虑如何最好地表达查询以获得较好的效率
- 系统可以比用户程序的优化做得更好
(1) 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息
(2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。
在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。
(3)优化器可以考虑数百种不同的执行计划,而程序员一般只能考虑有限的几种可能性。
(4)优化器中包括了很多复杂的优化技术
- 查询优化的总目标
选择有效策略,求得给定关系表达式的值
- 实际系统的查询优化步骤
1. 将查询转换成某种内部表示,通常是语法树
2. 根据一定的等价变换规则把语法树转换成标准
(优化)形式
3. 选择低层的操作算法
对于语法树中的每一个操作
- 计算各种执行算法的执行代价
- 选择代价小的执行算法
4. 生成查询计划(查询执行方案)
查询计划是由一系列内部操作组成的。
6.2.4 关系代数等价变换规则
- 关系代数表达式等价
- 指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
- 上面的优化策略大部分都涉及到代数表达式的变换
6.2.6 优化的一般步骤
1.把查询转换成某种内部表示
2.代数优化:把语法树转换成标准(优化)形式
3.物理优化:选择低层的存取路径
4.生成查询计划,选择代价最小的
第十章 并发控制
- DBMS必须提供并发控制机制
- 并发控制机制是衡量一个DBMS性能的重要标志之一
并发操作带来的数据不一致性
- 丢失修改(lost update)
- 不可重复读(non-repeatable read)
- 读“脏”数据(dirty read)
1. 丢失修改
丢失修改是指事务1与事务2从数据库中读入同一数据并修改,事务2的提交结果破坏了事务1提交的结果,导致事务1的修改被丢失。
2. 不可重复读
不可重复读是指事务1读取数据后,事务2
执行更新操作,使事务1无法再现前一次读
取结果。
事务1读取某一数据后:
1.事务2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。
2. 事务2删除了其中部分记录,当事务1再次读取数据时,发现某些记录神密地消失了。
3. 事务2插入了一些记录,当事务1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时也称为幻影现象(phantom row)
3. 读“脏”数据
事务1修改某一数据,并将其写回磁盘,事务2读取同一数据后,事务1由于某种原因被撤消,这时事务1已修改过的数据恢复原值,事务2读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏”数据。
8.2 封锁
一、什么是封锁
- 封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁
- 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
- 封锁是实现并发控制的一个非常重要的技术
二、基本封锁类型
- 基本封锁类型
排它锁(eXclusive lock,简记为X锁)
共享锁(Share lock,简记为S锁)
8.3 封锁协议
- 在运用X锁和S锁对数据对象加锁时,需要约定一些规则:封锁协议(Locking Protocol)
- 何时申请X锁或S锁
- 持锁时间
- 何时释放
- 不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证
- 常用的封锁协议:三级封锁协议
1级封锁协议
一级封锁协议 vs 不可重读
2级封锁协议
二级封锁协议 vs 不可重读
3级封锁协议
总结
8.4 活锁和死锁
活锁
定义:事务𝑻𝟏封锁了数据R 事务𝑻𝟐又请求封锁R,于是𝑻𝟐等待。 也请求封锁R,当𝑻𝟏释放了R上的封锁之后系统首先批准 了𝑻𝟑的请求, 𝑻𝟐仍然等待。 又请求封锁R,当𝑻𝟑释放了R上的封锁之后系统又批准了 𝑻𝟒的请求…… 有可能永远等待,这就是活锁的情形
避免活锁:采用先来先服务的策略, 当多个事务请求封锁同一数据对象时 ,按请求封锁的先后次序对这些事务排队, 该数据对象上的锁一旦释放,首先批准申请队列中第一 个事务获得锁。
死锁
定义
事务𝑻𝟏封锁了数据𝑹𝟏,封锁了数据𝑹𝟐,又请求封锁𝑹𝟐 ,因𝑻𝟐已封锁了𝑹𝟐 ,于是𝑻𝟏等待𝑻𝟐释放 𝑹𝟐上的锁 , 接着𝑻𝟐又申请封锁𝑹𝟏 ,因𝑻𝟏已封锁了𝑹𝟏 , 𝑻𝟐也只能等待 𝑻𝟏释放𝑹𝟏上的锁 , 这样𝑻𝟏在等待𝑻𝟐 ,而𝑻𝟐又在等待𝑻𝟏 , 𝑻𝟏和𝑻𝟐两个事务永 远不能结束,形成死锁
死锁的预防
(1)一次封锁法
- 要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
- 一次封锁法存在的问题:降低并发度
- 扩大封锁范围
- 将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度
- 难于事先精确确定封锁对象
- 数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象
- 解决方法:将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发度。
(2)顺序封锁法
- 顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
- 顺序封锁法存在的问题
- 维护成本高
- 数据库系统中可封锁的数据对象极其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高
- 难于实现
- 事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。
2. 死锁的诊断与解除
- 允许死锁发生
- 解除死锁
- 由DBMS的并发控制子系统定期检测系统中是否存在死锁
- 一旦检测到死锁,就要设法解除
检测死锁:超时法
- 如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
- 优点:实现简单
- 缺点
- 有可能误判死锁
- 时限若设置得太长,死锁发生后不能及时发现
等待图法
8.5 并发调度的可串行性
- 几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。这种并行调度策略称为可串行化(Serializable)的调度。
可串行性是并行事务正确性的唯一准则
- 保证并发操作调度正确性的方法
- 封锁方法:两段锁(Two-Phase Locking,简称2PL)协议
- 时标方法
- 乐观方法
8.6 两段锁协议
- 两段锁协议的内容
Ⅰ 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
Ⅱ 在释放一个封锁之后,事务不再获得任何其他封锁。
并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。
所有遵守两段锁协议的事务,其并行执行的结果一定是正确的。
两段锁协议与三级封锁协议
- 两类不同目的的协议
- 两段锁协议
- 保证并发调度的正确性
- 三级封锁协议
- 在不同程度上保证数据一致性
- 两段锁协议
遵守第三级封锁协议必然遵守两段协议
8.7 封锁的粒度
一、什么是封锁粒度
- X锁和S锁都是加在某一个数据对象上的
- 封锁的对象:逻辑单元,物理单元
- 逻辑单元: 属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等
- 物理单元:页(数据页或索引页)、物理记录等
二、选择封锁粒度的原则
封锁粒度与系统的并发度和并发控制的开销密切相关;封锁的粒度越大,数据库所能够封锁的数据单元就越 少,并发度就越小,系统开销也越小;但并发度低 , 封锁的粒度越小,并发度较高,但系统开销也就越大。
- 封锁的粒度越 大,小,
- 系统被封锁的对象 少,多,
- 并发度 小,高,
- 系统开销 小,大,
- 选择封锁粒度:考虑封锁机构和并发度两个因素
对系统开销与并发度进行权衡
- 需要处理多个关系的大量元组的用户事务:以数据库为封锁单位;
- 需要处理大量元组的用户事务:以关系为封锁单元;
- 只处理少量元组的用户事务:以元组为封锁单位
8.7.2 多粒度封锁
显式封锁和隐式封锁
- 显式封锁: 直接加到数据对象上的封锁
- 隐式封锁: 由于其上级结点加锁而使该数据对象加上了锁
- 显式封锁和隐式封锁的效果是一样的
8.7.3 意向锁
- 引进意向锁(intention lock)目的
- 提高对某个数据对象加锁时系统的检查效率
- 对任一结点加基本锁,必须先对它的上层结点加意向锁
- 如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
Is意向锁
意向排它锁
共享意向排它锁:
补充: