关系数据结构及形式化定义
关系
- 在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表
域(domain)
- 域是一组具有相同数据类型的值的集合
笛卡尔积(cartesian product)
- 笛卡尔积是域上的一种集合运算
- 给定一组域
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∈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元组(n-tuple),或简称元组(tuple)。元素的某一个值 d i d_i di叫做一个分量(component)。
一个域允许的不同取值个数称为这个域的基数(cardinal number)。
关系(relation)
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表示关系的名字,n是关系的目或度(degree)。
- 当n=1时,称该关系为单元关系(unary relation),或一元关系
- 当n=2时,称该关系为二元关系(binary relation)
关系中的每个元素是关系中的元组,通常用t表示
若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码(candidate key)
若一个关系有多个候选码,则选定其中一个为主码(primary key);候选码的诸属性称为主属性(prime attribute)。不包含在任何候选码中的属性称为非主属性(non-prime attribute)或非码属性(non-key attribute)
在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码,称为全码(all-key)
关系可以有三种类型:基本关系(通常又称为基本表或基表)、查询表和视图表
- 基本关系(基本表或基表):实际存在的表,是实际存储数据的逻辑表示
- 查询表:查询结果的对应表
- 视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系具有以下6条性质:
- 列是同质的(homogeneous)
- 不同的列可出自同一个域,其中的每一列称为一个属性 ,不同的属性要给予不同的属性名
- 列的顺序无所谓,即列的次序可以任意交换
- 任意两个元组的候选码不能相同
- 行的顺序无所谓,即行的次序可以任意交换
- 分量必须取原子值,即每一个分量都必须是不可分的数据项
关系模式
- 关系的描述称为关系模式(relation schema)。它可以形式化地表示为
R
(
U
,
D
,
D
O
M
,
F
)
R(U,D,DOM,F)
R(U,D,DOM,F)
其中R为关系名,U为组成该关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映像4部分,即 R ( U , D , D O M ) R(U,D,DOM) R(U,D,DOM)
关系数据库
- 关系数据库的型也称为关系数据库模式,是对关系数据库的描述
- 关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库
关系模型的存储结构
- 在关系数据模型中实体及实体间的联系都用表来表示,但表是关系数据的逻辑模型。
- 在关系数据库的物理组织中,有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成;有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。
关系操作
基本的关系操作
- 关系模型中常用的关系操作包括查询(query)操作和插入(insert)、删除(delete)、修改(update)操作两大部分
- 查询操作又可以分为选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(except)、交(intersection)、笛卡尔积等
- 其中选择、投影、并、差、笛卡尔积是5种基本操作
- 关系操作的特点是集合操作方式,即操作的对象和结果都是集合。这种操作方式也称为一次一集合(set-at-a-time)的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。
关系数据语言的分类
- 早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数(relational algebra)和关系演算(relational calculus)。关系代数用对关系的运算来表达查询要求,关系演算是用谓词表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。
- 另外,还有一种介于关系代数和关系演算之间的结构化查询语言(Structured Query Language,SQL)。SQL不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、数据定义语言(DDL)、数据操作语言(DML)和数据控制语言(DCL)于一体的关系数据语言。
关 系 数 据 语 言 { 关 系 代 数 语 言 ( 例 如 I S B L ) 关 系 演 算 语 言 { 元 组 关 系 演 算 语 言 ( 例 如 A L P H A 、 Q U E L ) 域 关 系 演 算 语 言 ( 例 如 Q B E ) 具 有 关 系 代 数 和 关 系 演 算 双 重 特 点 的 语 言 ( 例 如 S Q L ) 关系数据语言\begin{cases} 关系代数语言(例如ISBL) \\ 关系演算语言\begin{cases} 元组关系演算语言(例如ALPHA、QUEL) \\ 域关系演算语言(例如QBE) \\ \end{cases}\\ 具有关系代数和关系演算双重特点的语言(例如SQL) \\ \end{cases} 关系数据语言⎩⎪⎪⎪⎨⎪⎪⎪⎧关系代数语言(例如ISBL)关系演算语言{元组关系演算语言(例如ALPHA、QUEL)域关系演算语言(例如QBE)具有关系代数和关系演算双重特点的语言(例如SQL)
关系的完整性
- 关系模型中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)
- 其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束
实体完整性
- 实体完整性规则:若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值(null value)。所谓空值就是"不知道"或"不存在"或"无意义"的值
对于实体完整性规则说明如下:
- 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集
- 现实世界中的实体是可区分的,即它们具有某种唯一性标识
- 相应地,关系模型中以主码作为唯一性标识
- 主码中的属性不能取空值
参照完整性
- 设F是基本关系R的一个或一组属性,但不是关系R的码, K s K_s Ks是基本关系S的主码。如果F与 K s K_s Ks相对应,则称F是R的外码(foreign key),并称基本关系R为参照关系(referencing relation),基本关系S为被参照关系(reference relation)或目标关系(target relation)。
参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码 K s K_s Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须:
- 或者取空值(F的每个属性均为空值)
- 或者等于S中某个元组的主码值
用户定义的完整性
- 用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求
关系代数
- 关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
- 运算对象、运算符、运算结果是运算的三大要素
- 关系代数用到的运算符包括两类:集合运算符和专门的关系运算符
传统的集合运算
- 传统的集合运算是二目运算,包括并、差、交、笛卡尔积4种运算
- 设关系R和关系S具有相同的目n(即两个关系都有n个属性),且相应的属性取自同一个域,t是元组变量,t∈R表示t是R的一个元组
- 并(union)
- 关系R与关系S的并记作 R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R∪S=\{t|t∈R∨t∈S\} R∪S={t∣t∈R∨t∈S},其结果仍为n目关系,由属于R或属于S的元组组成
- 差(except)
- 关系R与关系S的差记作 R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t|t∈R∧t∉S\} R−S={t∣t∈R∧t∈/S},其结果关系仍为n目关系,由属于R而不属于S的所有元组组成
- 交(intersection)
- 关系R与关系S的交记作 R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R∩S=\{t|t∈R∧t∈S\} R∩S={t∣t∈R∧t∈S},其结果关系仍为n目关系,由既属于R又属于S的元组组成。关系的交可以用差来表示,即 R ∩ S = R − ( R − S ) R∩S=R-(R-S) R∩S=R−(R−S)
- 笛卡尔积(cartesian product)
- 两个分别为n目和m目的关系R和S的笛卡尔积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有 k 1 k_1 k1个元组,S有 k 2 k_2 k2个元组,则关系R和关系S的笛卡尔积有 k 1 × k 2 k_1×k_2 k1×k2个元组。记作 R × S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S } R×S=\{\widehat{t_rt_s}|t_r∈R∧t_s∈S\} R×S={trts ∣tr∈R∧ts∈S}
专门的关系运算
专门的关系运算包括选择、投影、连接、除运算等
- 设关系模式为 R ( A 1 , A 2 , . . . , A n ) R(A_1,A_2,...,A_n) R(A1,A2,...,An),它的一个关系设为R。t∈R表示t是R的一个元组。 t [ A i ] t[A_i] t[Ai]则表示元组t中相应于属性 A i A_i Ai的一个分量
- 若 A = A i 1 , A i 2 , . . . , A i k A={A_{i1},A_{i2},...,A_{ik}} A=Ai1,Ai2,...,Aik,其中 A i 1 , A i 2 , . . . , A i k A_{i1},A_{i2},...,A_{ik} Ai1,Ai2,...,Aik是 A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1,A2,...,An的一部分,则A称为属性列或属性组。 t [ A ] = ( t [ A i 1 ] , t [ A i 2 ] , . . . , t [ A i k ] ) t[A]=(t[A_{i1}],t[A_{i2}],...,t[A_{ik}]) t[A]=(t[Ai1],t[Ai2],...,t[Aik])表示元组t在属性列A上诸分量的集合, A ˉ \bar{A} Aˉ则表示 { A 1 , A 2 , . . . , A n } \{A_1,A_2,...,A_n\} {A1,A2,...,An}中去掉 { A i 1 , A i 2 , . . . , A i k } \{A_{i1},A_{i2},...,A_{ik}\} {Ai1,Ai2,...,Aik}后剩余的属性组
- R为n目关系,S为m目关系。 t r ∈ R , t s ∈ S , t r t s ^ t_r∈R,t_s∈S,\widehat{t_rt_s} tr∈R,ts∈S,trts 称为元组的连接(concatenation)或元组的串接。它是一个m+n列元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组。
- 给定一个关系R(X,Z),X和Z为属性组。当
t
[
X
]
=
x
t[X]=x
t[X]=x时,x在R中的象集(images set)定义为
Z
x
=
{
t
[
Z
]
∣
t
∈
R
,
t
[
X
]
=
x
}
Z_x=\{t[Z]|t∈R,t[X]=x\}
Zx={t[Z]∣t∈R,t[X]=x},它表示R中属性组X上值为x的诸元组在Z上分量的集合。
- 选择(selection)
- 选择又称为限制(restriction)。它是在关系R中选择满足给定条件的诸元组,记作 σ F = t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ σ_F={t|t∈R∧F(t)='真'} σF=t∣t∈R∧F(t)=′真′,其中F表示选择条件,它是一个逻辑表达式,取逻辑值"真"或"假"
- 逻辑表达式F的基本形式为 X 1 θ Y 1 X_1θY_1 X1θY1,其中θ表示比较运算符,它可以是>,≥,<,≤,=或<>(不等于)。 X 1 , Y 1 X_1,Y_1 X1,Y1等是属性名,或为常量,或为简单函数;属性名也可以用它的序号来代替。在基本的选择条件上可以进一步进行逻辑运算,即进行非(┐)、与(∧)、或(∨)运算。
- 选择运算实际上是从关系R中选取使逻辑表达式F为真的元组。这是从行的角度进行的运算。
- 投影(projection)
- 关系R上的投影是从R中选择出若干属性组成新的关系。记作 ∏ A ( R ) = { t [ A ] ∣ t ∈ R } \prod_A(R)=\{t[A]|t∈R\} ∏A(R)={t[A]∣t∈R},其中A为R中的属性列
- 投影操作是从列的角度进行的运算
- 投影之后不仅取消了原关系中的某些列,而且很可能取消某些元组,因为取消了某些属性列后,就可能出现重复行,应取消这些完全相同的行。
- 连接(join)
- 连接也称为θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。记作 R ⋈ S A θ B = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } \underset{AθB}{R⋈S}=\{\widehat{t_rt_s}|t_r∈R∧t_s∈S∧t_r[A]θt_s[B]\} AθBR⋈S={trts ∣tr∈R∧ts∈S∧tr[A]θts[B]}
- 其中,A和B分别为R和S上列数相等且可比的属性组,θ是比较运算符。连接运算从R和S的笛卡尔积R×S中选取R关系在A属性组上的值与S关系在B属性组上的值满足比较关系θ的元组
- 连接运算中有两种最为重要也最为常用的连接,一种是等值连接(equijoin),另一种是自然连接(natural join)
- θ为"="的连接运算称为等值连接。它是从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组,即等值连接为 R ⋈ S A θ B = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] = t s [ B ] } \underset{AθB}{R⋈S}=\{\widehat{t_rt_s}|t_r∈R∧t_s∈S∧t_r[A]=t_s[B]\} AθBR⋈S={trts ∣tr∈R∧ts∈S∧tr[A]=ts[B]}
- 自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。即若R和S中具有相同的属性组B,U为R和S的全体属性集合,则自然连接可记作 R ⋈ S A θ B = { t r t s ^ [ U − B ] ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] = t s [ B ] } \underset{AθB}{R⋈S}=\{\widehat{t_rt_s}[U-B]|t_r∈R∧t_s∈S∧t_r[A]=t_s[B]\} AθBR⋈S={trts [U−B]∣tr∈R∧ts∈S∧tr[A]=ts[B]}
- 一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
- 两个关系R和S在做自然连接时,选择两个关系在公共属性上值相等的元组构成新关系的元组。此时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,同样,S中某些元组也可能被舍弃。这些被舍弃的元组称为悬浮元组(dangling tuple)。
- 如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null),就叫做外连接 (outer join);如果只保留左边关系R中的悬浮元组就叫做左外连接(left outer join或left join);如果只保留由边关系S中的悬浮元组就叫做右外连接(right outer join或right join)
- 除运算(division)
- 设关系R除以S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中。
- 给定关系R(X,Y)和S(Y,Z),其中X,Y,Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。
- R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集 Y x Y_x Yx包含S在Y上投影的集合。记作 R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ ∏ Y ( S ) ⊆ Y x } R÷S=\{t_r[X]|t_r∈R∧\prod_Y(S)⊆Y_x\} R÷S={tr[X]∣tr∈R∧∏Y(S)⊆Yx},其中 Y x Y_x Yx为x在R中的象集, x = t r [ X ] x=t_r[X] x=tr[X]。
- 除操作是同时从行和列角度进行的