数据库管理系统(DBMS)
基本概念
功能
- 数据定义
- 数据库操作
- 数据库运行管理
- 数据的组织、存储和管理
- 数据库的建立和维护
- 其他功能
特征
- 数据结构化且统一管理 (易维护、易扩展、数据冗余少)
- 有较高的数据独立性 (物理独立性和逻辑独立性)
- 数据控制能力 (对数据的安全性、完整性、并发和恢复的控制)
分类
- 关系数据库系统(Relation DataBase System,RDBS)
- 面向对象数据库系统(Object-Oriented DataBase System, OODBS)
- 对象关系数据库系统(Object-Oriented Relation DataBase System, ORDBS)
数据模型
- 概念数据模型
是按用户观点对数据和信息的建模,主要用于数据库设计。
E-R模型(实体-联系模型 Entity-Relationship Model)
弱实体(双线矩形框表示):一个实体的存在必须以另一个实体为前提,这类实体称为弱实体。
- 基本数据模型
是按计算机系统的观点对数据建模。
包含数据模型有:
层次模型:采用树型结构表示数据与数据之间的关系。 网状模型(DBTG模型):比层次模型更具有普遍性的数据结构,是层次模型的一个特例。
关系模型:表格结构表达实体集以及实体集之间的关系,其最大的特色是描述的一致性。 面向对象模型:采用面向对象的方法来设计数据库。
数据模型三要素
- 数据结构
- 数据操作
- 数据的约束条件
关系代数
属性和域
在现实世界中,要描述一个事物常常取若干特征来表示,这些特征称为属性(Attrbute)。
没一个属性的取值范围对应一个值的集合,称为该属性的域(Domain)。
笛卡尔积与关系
集合建构式
设 D 1 , D 2 , … , D i , … , D n D_1,D_2,…,D_i,…,D_n D1,D2,…,Di,…,Dn 为任意集合,
定义 D 1 , D 2 , … , D i , … , D n D_1,D_2,…,D_i,…,D_n D1,D2,…,Di,…,Dn 的笛卡儿积为 D 1 × D 2 × … × D i × … × D n = { ( d 1 , d 2 , … , d i , … d n ) ∣ d i ∈ D i , i = 1 , 2 , 3 , … , n } D_1×D_2×…×D_i×…×D_n =\{(d_1,d_2,…,d_i,…d_n)|d_i∈D_i,i=1,2,3,…,n\} D1×D2×…×Di×…×Dn={(d1,d2,…,di,…dn)∣di∈Di,i=1,2,3,…,n}
其中每一个元素 ( d 1 , d 2 , … , d i , … d n ) (d_1,d_2,…,d_i,…d_n) (d1,d2,…,di,…dn) 称为一个n元组(n-tuple属性的个数),
元组的每个值 d i d_i di 称为元组的一个分量。
若 D i ( i = 1 , 2 , 3 , … , n ) D_i(i=1,2,3,…,n) Di(i=1,2,3,…,n) 为有限集,其基数(Cardinal number元组的个数)为 m i ( i = 1 , 2 , 3 , … , n ) m_i(i=1,2,3,…,n) mi(i=1,2,3,…,n)
则 D 1 × D 2 × … × D i × … × D n D_1×D_2×…×D_i×…×D_n D1×D2×…×Di×…×Dn 的基数M如下: M = ∏ i = 1 n m i M = \prod_{i=1}^nm_i M=i=1∏nmi
D 1 × D 2 × … × D i × … × D n D_1×D_2×…×D_i×…×D_n D1×D2×…×Di×…×Dn的子集称为在域 D 1 , D 2 , … , D i , … , D n D_1,D_2,…,D_i,…,D_n D1,D2,…,Di,…,Dn上的关系,记为 R ( D 1 , D 2 , … , D i , … , D n ) R(D_1,D_2,…,D_i,…,D_n) R(D1,D2,…,Di,…,Dn),称关系R为n元关系。
关系相关名词
元组:集合 R 的一个属性值
分量:元组的每一个值称为元组的一个分量
基数:集合 R 中元组的个数
- 目或度(Degree):R表示关系名称,n是关系的目或度。
- 候选码(Candidate Key):关系中能唯一地标识一个元组的某一属性或属性组,称为候选码
- 主码(Primary Key):若关系中有多个候选码,则选定其中一个为主码。
- 主属性(Non-Key attrbute):包含在任何候选码中的诸属性称为主属性,否则称为非码属性。
- 外码(Foreign Key):关系模式R中属性或属性组非该关系的码,但他是其它关系的码,那么该属性集对关系模式R而言是外码。
- 全码(All-Key):关系模型中所有属性是这个关系模式的候选码,称为全码(关系模型需要所有属性才能唯一标识一个元组)
关系的三种类型
- 基本关系:又称为基本表或基表,它是实际存在的表,是实际存储数据的逻辑表示。
- 查询表:查询结果对应的表。
- 视图表:是由基本表或其它视图表导出的表,由于它本身不独立存储在数据库中,数据库中只存放它的定义,所以常称虚表。
关系数据库模式
关系的描述称为关系模式(Relation Schema) 可以形式化地表示为:
R(U,D,dom,F) 通常简记为 R(U) 或 R(A1,A2,…An)
R 表述关系名,
U 是组成该关系的属性名的集合,
D 是属性的域,
dom 是属性向域的影像集合,
F 为属性间数据的依赖关系集合。
完整性约束
- 实体完整性(Entity Integrity):规定基本关系 R 的主属性不能取空值
- 参照完整性(Referential Integrity),也称引用完整性:外键约束
- 用户定义完整性(User Defined Integrity):属性值域的约束
关系运算
关系代数运算符(4类)
- 集合运算符
- 专门的关系运算符
- 算术比较运算符
- 算术逻辑运算符。
5种基本的关系代数运算
5种基本的关系代数运算包括并、差、笛卡儿积、投影和选择,其他运算可以通过基本的关系运算导出。
1. 并(⋃)
关系R与S具有相同的关系模式,即关系R与S的元数相同(结构相同)。 关系R与S的并是由属于R或属于S的元组构成的集合。记作 R ⋃ S R \bigcup S R⋃S ,其形式定义如下:
R ⋃ S = { t ∣ t ∈ R ∨ t ∈ S } R \bigcup S = \{ t \mid t \in R \vee t \in S\} R⋃S={t∣t∈R∨t∈S}
其中 t 为元组变量, ∨ \vee ∨逻辑或(逻辑析取)
2. 差(−)
关系R与S具有相同的关系模式。 关系R与S的差是由属于R但不属于S的元组构成的集合。记作 R − S R-S R−S,其定义形式如下:
R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S = \{t \mid t \in R \wedge t\notin S \} R−S={t∣t∈R∧t∈/S}
其中 t 为元组变量, ∧ \wedge ∧逻辑与(逻辑合取)
3. 广义笛卡儿积(×)
两个元数分别为 n 目或 m 目的关系 R 和 S 的广义笛卡儿积是一个 (n+m) 列的元组的集合。
元组的前 n 列是关系 R 的一个元组,后 m 列是关系 S 的一个元组,记作 R × S R×S R×S,其形式定义如下:
R × S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S } R × S = \{t\mid t =< t^n, t^m > \wedge t^n \in R \wedge t^m \in S\} R×S={t∣t=<tn,tm>∧tn∈R∧tm∈S}如果 R 和 S 中有相同的属性名,可在属性名前加关系名作为限定,以示区别。
注意: < t n , t m > < t^n,t^m> <tn,tm> 意为元组 t n t^n tn 和 t m t^m tm 拼接成的一个元组。
4. 投影(π)
投影运算是从关系的垂直方向进行运算,在关系 R 中选出若干属性列 A 组成新的关系,记作 π A ( R ) π_A(R) πA(R),其定义形式如下:
π A ( R ) = { t [ A ] ∣ t ∈ R } π_A(R) = \{t[A]\mid t \in R\} πA(R)={t[A]∣t∈R}
5. 选择(σ)
选择运算是从关系的水平方向进行运算,是从关系 R 中选择满足给定条件的诸元组,记作 σ F ( R ) σ_F(R) σF(R),其定义形式如下:
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = T r u e } \sigma_F(R) = \{t \mid t \in R \wedge F(t) = True \} σF(R)={t∣t∈R∧F(t)=True}其中,F 中的运算对象是属性名(或列的序号)或常数,运算符、算术比较符(<、≤、>、≥、
≠)和逻辑运算符( ∧ 、 ∨ 、 ¬ \wedge、\vee、\neg ∧、∨、¬)。 ¬ \neg ¬(非 | 逻辑否定)
例如:
σ 1 ≥ 6 ( R ) \sigma_{1\geq6}(R) σ1≥6(R)表示选取R关系中第1个属性值大于等于第6个属性值的元组,
σ 1 ≥ ′ 6 ′ ( R ) \sigma_{1\geq'6'}(R) σ1≥′6′(R)表示选取R关系中第1个属性值大于等于6的元组。
扩展的关系代数运算
扩展的关系代数运算可以从基本的关系运算中导出,主要包括选择、投影、连接、除法、广义笛卡儿积和外连接。
1. 交(⋂)
关系 R 与 S具有相同关系模式,关系 R 与 S 的交是由属于 R 同时又属于 S 的元组构成的集合,记作 R ⋂ S R \bigcap S R⋂S,其形式定义如下:
R ⋂ S = { t ∣ t ∈ R ∧ t ∈ S } R \bigcap S = \{t\mid t \in R \wedge t \in S\} R⋂S={t∣t∈R∧t∈S}
推导 R ⋂ S = R − ( R − S ) ,或者 R ⋂ S = S − ( S − R ) R \bigcap S = R - (R-S),或者 R \bigcap S = S - (S-R) R⋂S=R−(R−S),或者R⋂S=S−(S−R)
2. 连接(⋈)
连接运算是从两个关系 R 和 S 的笛卡儿积中选取满足条件的元组。因此可认为笛卡儿积是无条件的连接, 其它的连接操作认为是有条件的连接。
θ连接:从 R 与 S 的笛卡儿积中选取属性间满足一定条件的元组。记作:
R ⋈ X θ Y S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S ∧ t n [ X ] θ t m [ Y ] } R \Join_{X\theta Y} S = \{t \mid t = <t^n, t^m> \wedge{t^n} \in R \wedge t^m \in S \wedge t^n[X]\theta{t^m[Y]}\} R⋈XθYS={t∣t=<tn,tm>∧tn∈R∧tm∈S∧tn[X]θtm[Y]}
XθY 为连接的条件,θ 是比较运算符,X 和 Y 分别为 R 和 S 上度数相等切可比的属性值。
t n [ X ] t^n[X] tn[X] 表示 R 中 t n t^n tn 元组的对应于属性 X 的一个分量。
t m [ Y ] t^m[Y] tm[Y] 表示 S 中 t m t^m tm 元组的对应于属性 Y 的一个分量。
① θ 连接也可表示为:
R ⋈ i θ j S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S ∧ t n [ i ] θ t m [ j ] } R \Join_{i\theta j} S = \{t \mid t = <t^n, t^m> \wedge{t^n} \in R \wedge t^m \in S \wedge t^n[i]\theta{t^m[j]}\} R⋈iθjS={t∣t=<tn,tm>∧tn∈R∧tm∈S∧tn[i]θtm[j]}
其中,i=1,2,3,…,n,j=1,2,3,…,m,iθj 的含义为从两个关系 R 和 S 中选取 R 的第 i 列和 S 的第 j 列之间满足 θ 运算的元组进行连接。
② θ 连接可以由基本的关系运算笛卡儿积和选取运算导出。因此,θ 连接可表示为:
R ⋈ X θ Y S = σ X θ Y ( R × S ) 或 R ⋈ i θ j S = σ i θ ( i + j ) ( R × S ) R \Join_{X\theta{Y}}S = \sigma_{X\theta{Y}}(R×S) 或 R \Join_{i\theta{j}}S = \sigma_{i\theta(i+j)}(R×S) R⋈XθYS=σXθY(R×S)或R⋈iθjS=σiθ(i+j)(R×S)等值连接:当 θ 为 = 时,称为等值连接,记作 R ⋈ X = Y S R \Join_{X=Y}S R⋈X=YS,其形式定义如下
R ⋈ X = Y S = { t ∣ t = < t n , t m > ∧ t n ∈ R ∧ t m ∈ S ∧ t n [ X ] = t m [ Y ] } R \Join_{X=Y} S = \{t \mid t = <t^n, t^m> \wedge{t^n} \in R \wedge t^m \in S \wedge t^n[X]={t^m[Y]}\} R⋈X=YS={t∣t=<tn,tm>∧tn∈R∧tm∈S∧tn[X]=tm[Y]}自然连接:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的两个分量必须是相同的属性组,并且在结果集中将重复属性列去掉(类似SQL内联)。自然连接可记为 R ⋈ S R\Join{S} R⋈S,其形式定义如下:
R ⋈ S = { t ∣ t = < t n , t m ∗ > ∧ t n ∈ R ∧ t m ∈ S ∧ R . B 1 = S . b 1 ∧ R . B 2 = S . B 2 ∧ . . . ∧ R . B k = S . B k } R\Join S = \{t\mid t=<t^n,t^{m^*}> \wedge t^n \in R \wedge t^m \in S \wedge R.B_1=S.b_1 \wedge R.B_2=S.B_2 \wedge ... \wedge R.B_k=S.B_k\} R⋈S={t∣t=<tn,tm∗>∧tn∈R∧tm∈S∧R.B1=S.b1∧R.B2=S.B2∧...∧R.Bk=S.Bk}
例:设有关系R、S如下图所示,求 R ⋈ S R \Join S R⋈S
解:然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中将重复属性列去掉。本题R与S关系中相同的属性组为AC,因此,结果集中的属性列应为ABCD,其结果如图9-18所示。
3. 除(÷)
除运算是同时从关系的水平方向和垂直方向进行运算。它给定关系R(X,Y) 和 S(Y,Z),X、Y、Z为属性组。R ÷ S 应当满足元组在 X 上的分量值 x x x 的象集 Y x Y_x Yx 包含关系 S 在属性 Y 上投影的集合。其形式定义如下:
R ÷ S = { t n [ X ] ∣ t n ∈ R ∧ π y ( S ) ⊆ Y x } R ÷ S = \{t^n[X] \mid t^n \in R \wedge π_y(S) \subseteq Y_x \} R÷S={tn[X]∣tn∈R∧πy(S)⊆Yx}
其中, Y x Y_x Yx 为 x x x 在 R 中的象集, x = t n [ X ] x = t^n[X] x=tn[X],且 R ÷ S R÷S R÷S 的结果集的属性组为 X X X。
例:有关系 R、S 如图 9-19 所示,求 R ÷ S R ÷ S R÷S,结果如图9-19(c)所示。
4. 广义投影
广义投影运算允许在投影列表中使用运算符,实现了对投影运算的扩充。
若有关系 R,条件 F 1 , F 2 , . . . , F n F_1,F_2,...,F_n F1,F2,...,Fn 中的每一个都是涉及 R 中常量和属性的算术表达式,那形式定义为:
π F 1 , F 2 , . . . , F n ( R ) π_{F_1,F_2,...,F_n} (R) πF1,F2,...,Fn(R)
示例:
5. 外连接(Outer Jion)
外连接运算是连接运算的扩展,可以处理由于连接运算而缺失的信息。
左外连接(⟕)
取出左侧关系中所有与右侧关系中任何一元组都不匹配的元组,用空值 null 填充右侧关系的属性,构成新的元组,将其加入自然连接的结果中。右外连接(⟖)
取出右侧关系中所有与左侧关系中任何一元组都不匹配的元组,用空值 null 填充左侧关系的属性,构成新的元组,将其加入自然连接的结果中。全外连接(⟗)
完成左外连接和右外连接的操作。 将其产生的新元组加入自然连接的结果中。
R ⟗ S = ( R ⟕ S ) ∪ ( R ⟖ S ) R ⟗ S = (R ⟕ S) ∪ (R ⟖ S) R⟗S=(R⟕S)∪(R⟖S)
关系数据库 SQL 语言简介
SQL包括 数据查询(Query)、数据操纵(Manipulation)、数据定义(Definition)和 数据控制(Control)功能。
SQL 特点
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 两种使用方式:自含式语言(终端命令),嵌入式语言
- 语言简洁,易学易用
SQL 支持三级模式结构
视图对应外模式、基本表对应模式、存储文件对应内模式。
SQL 基本组成
- 数据定义语言(Data Definition Language,DDL):定义关系模式和视图、删除关系和视图、修改关系模式的命令。
- 交互式数据操纵语言(Data Manipulation Language,DML):增删改查命令。
- 事物控制
- 嵌入式 SQL 和动态 SQL
- 完整性:SQL DDL包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止。
- 权限管理:SQL DDL中包括说明对关系和视图的访问权限。
函数依赖
数据依赖依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系 。函数依赖是一种最重要、最基本的数据依赖。
- 函数依赖
设 R(U) 是属性集 U 上的关系模式,X、Y 是 U 的子集。若对 R(U) 的任何一个可能的关系 r,r 中不可能存在两个元组在 X 上的属性值相等,而在 Y 上的属性值不等,则称 X 函数决定 Y 或 Y 函数依赖于 X,记作: X → Y X \rightarrow Y X→Y。- 非平凡的函数依赖
如果 X → Y X \rightarrow Y X→Y,但 Y ⊈ X Y \not\subseteq X Y⊆X,则称 X → Y X \rightarrow Y X→Y 是非平凡函数依赖。一般情况下,讨论的都是非平凡函数依赖- 平凡函数依赖
如果 X → Y X \rightarrow Y X→Y,但 Y ⊆ X Y \subseteq X Y⊆X,则称 X → Y X \rightarrow Y X→Y 是平凡函数依赖。- 完全函数依赖
在 R(U) 中,如果 X → Y X \rightarrow Y X→Y,并且对于 X 的任何一个真子集 X ′ X^{'} X′ 都有 X ′ X^{'} X′ 不能决定 Y,则称 Y 对 X 完全函数依赖,记作: X → f Y X \overset f \rightarrow Y X→fY。
例:给定一个学生选课关系SC(Sno,Cno,G),可以得到F={(Sno,Cno)→G},对(Sno,Cno)中的任何一个真子集Sno或Cno都不能决定G,所以,G完全依赖于Sno、Cno。- 部分函数依赖
如果 X → Y X \rightarrow Y X→Y,但 Y 不完全函数依赖于 X,称 Y 对 X 部分函数依赖,记作: X → P Y X \overset P \rightarrow Y X→PY。- 传递依赖
在 R(U, F) 中,如果 X → Y , Y ⊈ X , Y → Z X \rightarrow Y,Y \not\subseteq X,Y \rightarrow Z X→Y,Y⊆X,Y→Z,则称 Z 对 X 传递依赖。- 码
设 K 为 R(U,F) 中属性的组合,若 K → U K→U K→U,且对于 K 的任何一个真子集 K ′ K^{'} K′ 都有 K ′ K^{'} K′ 不能决定 U,则 K 为 R 的候选码。- 主属性和非主属性
包含在任何一个候选码中的属性称为主属性,否则称为非主属性。- 外码
若 R(U) 中的属性或属性组 X 非 R 的码,但 X 是另一个关系的码,则称 X 为外码。- 逻辑蕴含
设关系模式 R(U,F),X、Y 是 R 的属性子集,若从 F 中的函数依赖能够推导出 X → Y X \rightarrow Y X→Y,则称 F 逻辑蕴含 X → Y X\rightarrow Y X→Y(或称 X → Y X\rightarrow Y X→Y是F的逻辑蕴涵),记作: F ⊨ X → Y 。 F \models X \rightarrow Y。 F⊨X→Y。- 闭包
被 F 逻辑蕴含的所有函数依赖集合称为 F 的闭包,记作: F + F^{+} F+。
若 F + = F F^{+}=F F+=F,则说 F 是一个全函数依赖族(函数依赖完备集)。- 函数依赖的公理系统
设关系模式 R(U,F),其中 U 为属性集,F 是 U 上的一组函数依赖,有以下推理规则:
- A1 自反律:若 Y ⊆ X ⊆ U Y \subseteq X \subseteq U Y⊆X⊆U,则 X→Y 为 F 所蕴涵。
- A2 增广律:若 X→Y 为 F 所蕴涵,且 Z ⊆ U Z \subseteq U Z⊆U,则 XZ→YZ 为 F 所蕴涵。
- A3 传递律:若 X→Y,Y→Z 为 F 所蕴涵,则 X→Z 为 F 所蕴涵
- 合并规则:若 X→Y,X→Z,则 X→YZ 为 F 所蕴涵。
- 伪传递率:若 X→Y,WY→Z,则 XW→Z 为 F 所蕴涵。
- 分解规则:若 X→Y, Z ⊆ Y Z \subseteq Y Z⊆Y, 则 X→Z 为 F 所蕴涵
数据库的控制功能
事务管理
事务特性
- 原子性:事务是原子的,要么都做,要么都不做。
- 一致性:事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态
- 隔离性:事务相互隔离。多个事务并发时,任一事务的更新操作直到其成功提交的整个过程,对其它事务不可见。
- 持久性:一旦事务提交,即使数据库崩溃,其对数据的更新操作也将永久有效。
并发控制
- 并发带来的问题:丢失修改、不可重复读,读脏数据。
- 并发控制技术
- 封锁
- 排它锁(X 锁):若事务 T 对数据对象 A 加上了 X 锁,则只允许 T 读取和修改 A,其它事务都不能再对 A 增加任何类型的锁,直到 T 释放 A 上的锁。
- 共享锁(S 锁):若事务 T 对数据对象 A 加上了 S 锁,则只允许 T 读取 A,但不能修改 A,其它事务只能再对 A 加 S 锁,直到 T 释放 A 上的 S 锁。保证了其它事务可读取 A,但在 T 释放 A 上的 S 锁之前不能对 A 进行任何修改。
- 三级封锁协议
- 一级封锁协议:事务在修改数据 R 之前必须先对其加 X 锁,直到事务结束才释放。可以解决丢失更新的问题。
- 二级封锁协议:在一级封锁协议的基础上,加上事务 T 在读数据 R 之前必须对其加 S 锁,读完后即可对其释放。可以解决读脏数据的问题,但不能保证可重复读。
- 三级封锁协议:在一级封锁协议的基础上,加上事务 T 在读数据 R 之前必须对其加 S 锁,直到事务结束时释放。防止丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
- 活锁与死锁
- 并发调度的可串行性
- 两段封锁协议
- 封锁的粒度
封锁对象的大小称为封锁的粒度。封锁的对象可以是逻辑单元(如属性、元组、关系、索引项、整个索引甚至整个数据库),也可以是物理单元(如数据页或索引页)。