2.1 关系数据结构及形式化定义
2.1.1 关系
关系模型只包含单一的数据结构——关系。
-
域
域是一组具有相同数据类型的值的集合。
一个域允许的不同取值的个数称为这个域的基数。
-
笛卡尔积
笛卡尔积是域上的一种集合运算。
给定一组域 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn,允许其中某些域是相同的, D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn的笛卡尔积为
D 1 × D 2 × . . . × D n = { ( d 1 , d 2 , . . . , d n ) ∣ d i ∈ D i , i = 1 , 2 , . . . , n } D_1×D_2×...×D_n=\{(d_1,d_2,...,d_n)|d_i\in D_i,i=1,2,...,n\} D1×D2×...×Dn={(d1,d2,...,dn)∣di∈Di,i=1,2,...,n}
其中,每一个元素 ( d 1 , d 2 , . . . , d n ) (d_1,d_2,...,d_n) (d1,d2,...,dn)叫作一个n元组,简称元组。
元组中的每一个值 d i d_i di叫做一个分量。
-
关系
D 1 × D 2 × . . . × D n D_1×D_2×...×D_n D1×D2×...×Dn的子集叫做在域 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn上的关系,表示为
R ( D 1 , D 2 , . . . , D n ) R(D_1,D_2,...,D_n) R(D1,D2,...,Dn)
这里 R R R表示关系的名字, n n n是关系的目或度。关系中的每个元素是关系中的元组,通常用 t t t表示。
当 n = 1 n=1 n=1时,称该关系为单元关系,或一元关系。
当 n = 2 n=2 n=2时,称该关系为二元关系。
关系时笛卡尔积的有限子集,所以关系也是一张二维表,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了讲一区分,必须对每列起一个名字,称为属性。 n n n目关系必有 n n n个属性。
若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。
若一个关系有多个候选码,则选定其中一个为主码。
候选码的诸属性称为主属性。不包含在任何候选码中的属性称为非主属性或非码属性。
在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性时,这个关系模式的候选码,称为全码。
一般来说, D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn的笛卡尔积是没有实际语义的,只有它的某个真子集才有实际含义。
关系可以有三种类型:基本关系(基本表/基表)、查询表和视图表。
基本关系具有以下六条性质:
- 列是同质的,即每一列中的分量是同一类型的数据,来自同一个域。
- 不同的列可以出自同一个域,称其中的每一列为一个属性,不同属性要给予不同的属性名。
- 列的顺序无所谓,即列的次序可以任意交换。在许多实际关系数据库产品中添加新属性时,永远插至最后一列。
- 任意两个元组的候选码不能取相同的值。
- 行的顺序无所谓,即行的次序可以任意交换。
- 分量必须取原子值,即每一分量都必须时不可分的数据项。【最基本的一条】
2.1.2 关系模式
关系的描述称为关系模式,可以形式化的表示为
R
(
U
,
D
,
D
O
M
,
F
)
R(U,D,DOM,F)
R(U,D,DOM,F)
其中,
R
R
R为关系名,
U
U
U为组成该关系的属性名集合,
D
D
D为
U
U
U中属性所来自的域,
D
O
M
DOM
DOM为属性向域的映像集合,
F
F
F为属性间数据的依赖关系集合。
注意:
关系时关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。
2.1.3 关系数据库
关系数据库的型(type)也称为关系数据库模式,是对关系数据库的描述。
关系数据库的值(value)是这些关系模式在某一时刻对应的关系的集合,通常称为关系数据库。
2.1.4 关系模型的存储结构
在关系数据库的物理组织中,有点关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成;有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。
2.2 关系操作
2.2.1 基本的关系操作
5种基本关系操作:选择、投影、并、差、笛卡尔积。
关系操作的特点是集合操作方式,即操作的对象和结果都是集合,称为一次一集合的方式。
2.2.2 关系数据语言的分类
2.3 关系的完整性
关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义完整性。
其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变性。
2.3.1 实体完整性
实体完整性规则:若属性(指一个或一组属性) A A A是基本关系 R R R的主属性,则 A A A不能取空值。所谓空值就是“不知道”或“不存在”或”无意义“的值。
解释说明:实体完整性规则是正对基本关系而言的。一个基本表通常对应现实世界的一个实体集。现实世界中的实体是可区分的,即它们具有某种唯一性标识。相应地,关系模型中以主码作为唯一标识。主码中的属性即主属性不能取空值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,与前言“现实世界中的实体是可区分的”矛盾。
2.3.2 参照完整性
设 F F F是基本关系 R R R的一个或一组属性,但不是关系 R R R的码, K S K_S KS是基本关系 S S S的主码。如果 F F F与 K S K_S KS相对应,则称 F F F是 R R R的外码,并称基本关系 R R R为参照关系,基本关系 S S S为被参照关系或目标关系。关系 R R R和 S S S不一定是不同的关系。
显然,目标关系 S S S的主码 K S K_S KS和参照关系 R R R的外码 F F F必须定义在同一个(或同一组)域上。
参照完整性规则:若属性(或属性组) F F F是基本关系 R R R的外码,它与基本关系 S S S的主码 K S K_S KS相对应(基本关系 R R R和 S S S不一定是不同的关系),则对于 R R R中每个元组在 F F F上的值必须:
- 或者取空值( F F F的每个属性值均为空值)
- 或者等于 S S S中某个元组的主码值。
2.3.3 用户定义的完整性
用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所设计的数据必须满足的语义要求。例如,某一属性必须取唯一值、某个非主属性不能取空值等。
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能。
2.4 关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
任何一种运算都是将一定的运算符作用域一定的运算对象上,得到预期的运算结果。运算对象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数的运算按运算符不同可分为传统的集合运算和专门的关系运算两类。其中,传统的集合运算将关系看成元组的集合,其运算是从关系的“水平”方向,即行的角度来进行;而专门的关系运算不仅涉及行,而且涉及列。比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的。
2.4.1 传统的集合运算
传统的集合运算时二目运算,包括并、差、交、笛卡尔积4种运算。
设关系 R R R和关系 S S S具有相同的目 n n n(即两个关系都有 n n n个属性),且相应的属性取自同一个域, t t t是元组变量, t ∈ R t\in R t∈R表示 t t t是 R R R的一个元组。
-
并
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t|t\in R\vee t\in S\} R∪S={t∣t∈R∨t∈S}
-
差
R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t|t\in R\wedge t\notin S\} R−S={t∣t∈R∧t∈/S} -
交
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S=\{t|t\in R\wedge t\in S\} R∩S={t∣t∈R∧t∈S} -
笛卡尔积
R × S = { t r t s ⌢ ∣ t r ∈ R ∧ t s ∈ S } R×S=\{\mathop{t_rt_s}\limits^{\frown}|t_r\in R\wedge t_s\in S\} R×S={trts⌢∣tr∈R∧ts∈S}
2.4.2 专门的运算关系
选择(限制)
σ
F
(
R
)
=
{
t
∣
t
∈
R
∧
F
(
t
)
=
′
T
r
u
e
′
}
\sigma F(R)=\{t|t\in R\wedge F(t)='True'\}
σF(R)={t∣t∈R∧F(t)=′True′}
其中,
F
F
F表示选择条件,是一个逻辑表达式,取逻辑值为"
T
r
u
e
True
True"或"
F
a
l
s
e
False
False"。
F
F
F的基本形式为
X
1
θ
Y
1
X_1\theta Y_1
X1θY1,
θ
\theta
θ为比较运算符,它可以是
>
\gt
>,
≥
\geq
≥,
<
\lt
<,
≤
\leq
≤,
=
=
=或
<
>
\lt\gt
<>。
X
1
X_1
X1,
Y
1
Y_1
Y1等是属性名,或为常量,或为简单函数;属性名也可以用它的序号来代替。在基本的选择条件上可以进一步进行逻辑运算,即进行求非(
¬
\lnot
¬)、与(
∨
\vee
∨)、或(
∧
\wedge
∧)运算。
选择运算实际上是从关系R中选取使逻辑表达式 F F F为真的元组,这是从行的角度进行的运算。
投影
∏
A
(
R
)
=
{
t
[
A
]
∣
t
∈
R
}
\prod_{A}(R)=\{t[A]|t\in R\}
A∏(R)={t[A]∣t∈R}
关系
R
R
R上的投影是从
R
R
R中选择出若干属性列
A
A
A组成新的关系。
连接(join)
R
⋈
A
θ
B
S
=
{
t
r
t
s
⌢
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
θ
t
s
[
B
]
}
R\bowtie_{A\theta B}S=\{\mathop{t_rt_s}\limits^{\frown}|t_r\in R\wedge t_s\in S\wedge t_r[A]\theta t_s[B]\}
R⋈AθBS={trts⌢∣tr∈R∧ts∈S∧tr[A]θts[B]}
连接也称为
θ
\theta
θ连接,是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。其中,
A
A
A和
B
B
B分别为
R
R
R和
S
S
S上列数相等且可比的属性组,
θ
\theta
θ是比较运算符。连接运算从
R
R
R和
S
S
S的笛卡尔积
R
×
S
R×S
R×S中选取
R
R
R关系在
A
A
A属性组上的值与
S
S
S关系在
B
B
B属性组上的值满足比较关系
θ
\theta
θ的元组。
连接运算中有两种最为重要也是最为常用的连接。一种是等值连接,另一种是自然连接。
θ
\theta
θ为“=”的连接运算称为等值连接,是从关系
R
R
R与
S
S
S的广义笛卡尔积中选取
A
A
A、
B
B
B属性值相等的那些元组。
R
⋈
A
=
B
S
=
{
t
r
t
s
⌢
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
=
t
s
[
B
]
}
R\bowtie_{A=B}S=\{\mathop{t_rt_s}\limits^{\frown}|t_r\in R\wedge t_s\in S\wedge t_r[A]=t_s[B]\}
R⋈A=BS={trts⌢∣tr∈R∧ts∈S∧tr[A]=ts[B]}
自然连接是一种特殊的等值连接,要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉,即若
R
R
R和
S
S
S具有相同的属性组
B
B
B,
U
U
U为
R
R
R和
S
S
S的全体属性集合。
R
⋈
S
=
{
t
r
t
s
⌢
[
U
−
B
]
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
=
t
s
[
B
]
}
R\bowtie S=\{\mathop{t_rt_s}\limits^{\frown}[U-B]|t_r\in R\wedge t_s\in S\wedge t_r[A]=t_s[B]\}
R⋈S={trts⌢[U−B]∣tr∈R∧ts∈S∧tr[A]=ts[B]}
一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
两个关系 R R R和 S S S在做自然连接时,选择两个关系在公共属性上值相等的元组够承新的关系。此时,关系 R R R中某些元组有可能在 S S S中不存在公共属性上值相等的元组,从而造成 R R R中这些元组在操作时被舍弃了,同样, S S S中某些元组也可能被舍弃。这些被舍弃的元组称为悬浮元组。
如果把悬浮元组保存在结果关系中,而在其他属性上填空值(NULL),那么这种连接就叫做外连接;如果只保留左边关系 R R R中的悬浮元组就叫做左外连接;如果只保留右边关系 S S S中的悬浮元组就叫做右外连接。
除运算
设关系 R R R除以关系 S S S的结果为关系 T T T,则 T T T包含所有在 R R R但不在 S S S中的属性及其值,且 T T T的元组与 S S S的元组的所有组合都在 R R R中。
用象集来定义除法:给定关系 R ( X , Y ) R(X,Y) R(X,Y)和 S ( Y , Z ) S(Y,Z) S(Y,Z),其中 X X X、 Y Y Y、 Z Z Z为属性组。 R R R中的 Y Y Y与 S S S中的 Y Y Y可以有不同的属性名,但必须出自相同的域集。
R
R
R与
S
S
S的除运算得到一个新的关系
P
(
X
)
P(X)
P(X),
P
P
P是
R
R
R中满足下列条件的元组在
X
X
X属性列上的投影:元组在
X
X
X上分量值
x
x
x得象集
Y
x
Y_x
Yx包含
S
S
S在
Y
Y
Y上投影的集合。
R
÷
S
=
{
t
r
[
X
]
∣
t
r
∈
R
∧
∏
Y
(
S
)
⊆
Y
x
}
R\div S=\{t_r[X]|t_r\in R\wedge\prod_{Y}(S)\subseteq Y_x\}
R÷S={tr[X]∣tr∈R∧Y∏(S)⊆Yx}
如图,
![]()
在关系 R R R中, A A A可以取4个值 { a 1 , a 2 , a 3 , a 4 } \{a_1,a_2,a_3,a_4\} {a1,a2,a3,a4}。
其中, a 1 a_1 a1的象集为 { ( b 1 , c 2 ) , ( b 2 , c 3 ) , ( b 2 , c 1 ) } \{(b_1,c_2),(b_2,c_3),(b_2,c_1)\} {(b1,c2),(b2,c3),(b2,c1)},
a 2 a_2 a2的象集为 { ( b 3 , c 7 ) , ( b 2 , c 3 ) } \{(b_3,c_7),(b_2,c_3)\} {(b3,c7),(b2,c3)},
a 3 a_3 a3的象集为 { ( b 4 , c 6 ) } \{(b_4,c_6)\} {(b4,c6)},
a 4 a_4 a4的象集为 { ( b 6 , c 6 ) } \{(b_6,c_6)\} {(b6,c6)},S S S在 ( B , C ) (B,C) (B,C)上的投影为 { ( b 1 , c 2 ) . ( b 2 , c 1 ) , ( b 2 , c 3 ) } \{(b_1,c_2).(b_2,c_1),(b_2,c_3)\} {(b1,c2).(b2,c1),(b2,c3)}。
显然,只有 a 1 a_1 a1的象集 ( B , C ) a 1 (B,C)_{a_1} (B,C)a1包含了 S S S在 ( B , C ) (B,C) (B,C)属性组上的投影。
所以, R ÷ S = { a 1 } R\div S=\{a_1\} R÷S={a1}。
关系代数中,这些运算经有限次复合后形成的表达式称为关系代数表达式。