2.1 关系模型

2.1.1 关系模型概述

关系数据模型由关系数据结构、关系操作集合和关系完整性约束3个部分组成。与格式化模型相比,关系模型比较简单,容易被初学者接受,它最主要的特征是采用关系来表示现实世界中实体集与实体集之间的联系。例如,在学生信息管理系统中有学生(student)、课程(course)、选课(select-course)3张关系表,分别描述了3个不同的实体集,如表2-1~表2-3所示。

表2-1 学生(student)

表2-2 课程(course)

表2-3 选课(select-course)

表2-1~表2-3这3张表就是3个关系,每一个关系都是由同一类记录组成,一个记录包含若干个属性,不同的关系可以拥有相同的属性(公共字段),它表示了关系间的联系,实体集间的联系是通过二维表中存放两个实体集的键(关键字)实现的。例如,学生(student)表和课程(course)表是没有直接关系的,因为它们没有共同的字段。但是学生(student)表和课程(course)表可以分别通过公共字段学号(SNo)、课程编号(CNo)和选课(select-course)表产生联系。

1.关系操作

关系数据模型提供了一系列操作的定义,这些操作称为关系操作。关系数据操作的主要特点是操作对象和操作结果都是集合。常用的关系操作包括查询操作和更新操作。其中,查询操作包括选择(select)、投影(project)、连接(join)、除(division)、并(union)、交(intersection)、差(difference)等操作。这些操作均是对关系的内容或表体实施操作,得到的结果仍为关系。更新操作包括增加(insert)、删除(delete)、修改(update)等操作。

关系数据语言分为下面3类。

(1)关系代数语言:如ISBL。

(2)关系演算语言:分为记录关系演算语言(如ALPHA、QUEL)、域关系演算语言(如QBE)。

(3)具有关系代数和关系演算双重特点的语言(如SQL)。

关系模型是建立在严格的数学理论基础之上的,主要概念如下:

(1)域(Domain):域是一组具有相同数据类型的值的集合,如整数、实数、介于某个取值范围之间的整数、指定长度字符串集合等。

(2)笛卡儿积(Cartesian Product):给定一组域D1D2,…,Dn,这些域可以相同,D1D2,…,Dn的笛卡儿积为

D1×D2×…×Dn={(D1d2,…,dndiDii=1,2,…,n}

笛卡儿积可以用二维表来表示。

(3)记录(Record):笛卡儿积中的每一个元素(d1,d2,…,dn),其中的每个值di称为分量(Component)。

(4)基数(Cardinal number):若d1(1,2,…,n)为有限集,其基数为mj(1,2,…,n),则D1×D2×…×Dn的基数M

(5)关系(Relation):D1×D2×…×Dn的子集称为域D1×D2×…×Dn上的关系,表示为R(D1×D2×…×Dn),其中R为关系名,n是关系的目或度(Degree)。

n=1时为单元关系,n=2时为二元关系。关系中的每个元素是关系中的记录,通常用t表示。

定义1:D1×D2×…×Dn的子集称为在域D1×D2×…×Dn上的关系,表示为R(D1×D2×…×Dn),称Rn元关系。

这里,R表示关系的名字,n是关系的目或度(Degree)。

·候选码:关系中唯一地标识一个记录的最小属性组,称该属性组为候选码。

·主码:若一个关系有多个候选码,那么选定其中一个为主码(Primary Key)。主码或候选码中的属性称为主属性,而不包含在任何候选码中的属性称为非码属性(Non-Key attribute)。关系模型的所有属性组是这个关系模式的候选码,称为全码(All-key)。

·外码(Foreign Key):设F是关系R的一个或一组属性,但不是关系R的码。如果F与关系S的主码K相对应,则称F是关系R的外码,关系R称为参照关系,关系S称为被参照关系或同标关系。

2.关系的种类与性质

关系的3种类型:

(1)基本关系(基本表或基表):实际存在的表。

(2)查询表:查询结果对应的表。

(3)视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。

基本关系有5条重要性质:

(1)每一字段中的分量必须是同一类型的数据,且来自同一个域。

(2)属性不能重名。

(3)行字段的顺序无关。

(4)任何两个记录不能完全相同。

(5)一个分量必须是不可再分的数据项。

从上述讨论可以看出,关系是记录的集合,记录是属性的组合,因而把关系看成是二维表的结构是自然而然的。当然,我们可以把关系看成是信息世界的表示,把表看成是数据世界的表示,而用文件将数据世界和计算机世界联系起来。

3.完整性规则

完整性规则是给定的数据模型中的数据及其联系所具有的制约和依存规则,用于限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。简单地说,就是用于保证数据的正确性。

例如,在学校的数据库中规定大学生入学年龄不得小于10岁,硕士研究生入学年龄不得小于15岁,学生累计成绩不得有3门以上不及格等。

在关系模型中提供了包括实体完整性、参照完整性和用户定义的完整性3类约束,其中前两者是关系模型必须满足的,称为关系的两个不变性,应该由关系型数据库管理系统自动支持。

1)实体完整性

一个基本关系通常对应现实世界中的一个实体集。现实世界中的实体是可区分的,即它们具有某种唯一性标识。相应地,在关系模型中定义主键作为实体的唯一性标识,也就是说,如果一个记录代表着一个具体实体,那么它是可以和同类实体相区分的。

定义2:实体完整性(Entity Integrity)规则是指定义关系中主键的取值不能为空值。

所谓空值NULL就是未知的或无意义的值。如果主键为空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与现实世界中的实体都是可区分的相矛盾,那么主码就失去了主码的唯一性标识作用。

例如,在兵员信息系统的兵员关系(士兵号,姓名,性别,出生年月,入伍时间,身份证号)中,“士兵号”为主键,则任意一个士兵的士兵号值不能为空值。

2)参照完整性

现实世界中的实体之间往往存在某种联系,在关系模型中,实体与实体间的联系是采用关系来描述的。

定义3:参照完整性(Referential Integrity)规则是指,若属性(或属性组)F是基本关系R的外码,它与关系S的主码K相对应,则对于R中每个记录在F上的值要么取空值(F的每个属性值均为空值),要么等于S中某个记录的主码值。F是否能为空值,主要依赖于应用的环境。

参照完整性规则定义了外键与主键之间的引用规则,是数据库中数据的一致性和准确性的保证。

例如,学生关系中每个记录的专业号只取下面两类值:空值,表示尚未给该学生分配专业;非空值,这时该值必须是专业关系中某个记录的“专业号”,表示该学生不可能分配到一个不存在的专业中。

选课关系(学号,课程号,成绩)中学号和课程号是主属性,按照实体完整性和参照完整性规则,它们只能取相应被参照关系中已经存在的主码值。

再如,有以下两个关系表:

    部门(部门编码,部门名称,电话,办公地址)
    职工(职工编码,姓名,性别,年龄,籍贯,部门编码)

职工关系中的“部门编码”与部门关系中的主键“部门编码”相对应,所以“部门编码”是职工关系的外键。职工关系通过外键描述与部门关系的关联。职工关系中的每个记录通过外键表示该职工所属的部门。

在职工关系中,某一个职工的“部门编码”要么取空值,表示该职工未被分配到指定部门;要么等于部门关系中某个记录的“部门编码”,表示该职工隶属于指定部门。若既不为空值,又不等于被参照关系部门中某个记录的“部门编码”分量值,表示该职工被分配到一个不存在的部门,则违背了参照完整性规则。当然,被参照关系的主键和参照关系的外键可以同名,也可以不同名。被参照关系与参照关系可以是不同关系,也可以是同一关系。

3)用户定义完整性

实体完整性规则和参照完整性规则分别定义了对主键的约束和对外键的约束,适用于任何关系数据库系统。除此之外,不同的关系数据库系统根据其应用环境的不同还需要一些特殊的约束条件。

定义4:用户定义完整性规则就是针对某一具体关系数据库的约束条件反映某一具体应用所涉及的数据必须满足的语义要求。

例如,关系课程(课程号,课程名,学分)中课程名必须取唯一值,课程名不能取空值,学分只能取值{1,2,3,4}。

关系模型应提供定义和检验这类完整性的机制,以便用统一的、系统的方法处理它们,而不要由应用程序承担这一功能。

2.1.2 关系代数

1.关系查询语言和关系运算

关系的查询操作是关系数据操纵语言的核心,可以分为抽象的查询语言和具体系统中的实际语言。关系代数作为一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它是用对关系的运算来表达查询的。关系代数是关系理论的基础,著名的关系型数据库语言(如SQL等)都是基于关系代数开发的。

关系代数的运算对象是关系,运算的结果也是关系。关系代数用到的运算符包括集合运算符、专门的关系运算符、算术比较符和逻辑运算符4类,如表2-4所示。

表2-4 关系代数运算符

根据运算符的不同,关系代数运算可分为传统的集合运算和专门的关系运算。

2.传统的集合运算

传统的集合运算是二目运算。从关系的水平方向选行的,主要包括并、交、差及广义笛卡儿积。

在进行关系的并、交、差运算时,假定参与运算的关系RS具有相同的目n,对应的属性取自同一域,且排列次序相同,这意味着RS具有相同的结构,称为相容(或同构)关系,这是进行并、交、差运算的前提。并、交、差的运算如下:

1)并(Union)

关系RS的并记作:

RS={tRtS}

其中,tR表示tR的一个记录。

例如,设关系RS分别如表2-5、表2-6所示,则RS如表2-7所示。

表2-5 关系R

表2-6 关系S

表2-7 R∪S

2)差(Difference)

关系RS的差记作:

RS={tRtS}

RS的差如表2-8所示。

表2-8 R−S

3)交(Intersection)

关系RS的交记作:

RS={tRtS}

RS的交如表2-9所示。

需要注意的是,交运算并不属于基本运算,它可以通过差运算导出,即:RS=R−(RS)。

表2-9 R∩S

4)广义笛卡儿积(Extended Cartesian Product)

两个分别为n目和m目的关系RS的广义笛卡儿积是一个(n+m)列的记录的集合。记录的前n列是关系R的一个n记录,后m列是关系S的一个m记录。若Rk1个记录,Sk2个记录,则RS的广义笛卡儿积有k1×k2个记录。记作:

广义笛卡儿积如表2-10所示。

表2-10 R×S

3.专门的关系运算

对于关系数据的操作,有些无法用传统的集合操作运算完成,如检索操作,此时需要引入一些新的运算,完成诸如属性指定、记录选择、关系合并等操作。专门的关系运算包括选择、投影、连接、自然连接和除操作。

1)选择(Selection)

选择运算是单目运算,对关系的水平方向进行运算,是指从关系R中选取满足给定条件的记录构成一个新的关系。记作:

σF(R)={t|tRF(t)='true'}

其中,σ是选择运算符,F是限定条件的布尔表达式。

例如,查询销售部人员的情况:

σ部门='销售'(S)

2)投影(Projection)

投影运算也是单目运算,它对关系的垂直方向进行运算,是指从一个关系R中选取所需要的列组成一个新关系,记作:

A(R)={t[A]tR}

其中,∏是投影运算符,A为关系R属性的子集,t[A]为R中记录相应于属性集A的分量。

例如,查询干部姓名及所在院系:

姓名,部门(干部)

投影运算在去掉了原关系的某些列后,可能会出现重复的记录,因此还应当去掉相同的行。

3)连接(Join)

连接运算是双目运算,分为θ连接、等值连接和自然连接3种。

(1)θ连接:它是从两个关系的笛卡儿积中选取属性间满足一定条件的记录。记作:

其中,θ是比较运算符,AB分别为RS上度数相等且可比的属性组。

(2)等值连接:当θ为“=”时,称之为等值连接。记作:

等值连接的计算过程首先是进行R×S,然后在结果中选择满足R中属性A的值与S中属性B的值相等的那些记录。

(3)自然连接:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中将重复属性列去掉。若RS具有相同的属性组B,则自然连接可以记作:

需要注意的是,一般连接是从关系的水平方向运算,自然连接不仅要从关系的水平方向运算,而且要从关系的垂直方向运算。因为自然连接要去掉重复属性,如果没有重复属性,那么自然连接就转化为笛卡儿积。

例如,检索选修课程名为“数据结构”的学生号和学生姓名:

因为为自然连接,结果需要去掉重复列。

4)除(Division)

除运算是同时从关系的水平方向和垂直方向进行运算。除运算是一个非传统的集合运算,它在关系运算中很重要,但较难理解。

设有关系RSR能被S除的条件有两个:①R中的属性包含S中的属性;②R中的有些属性不出现在S中。R除以S表示为R/SR÷S。设T=R/S,它也是一个关系,称为商(Quotient)。T的属性由R中那些不出现在S中的属性组成,其记录则是S中所有记录在R中对应值相同的那些记录值。

给定关系R(X,Y)和S(Y),其中X,Y为属性组。R中的YS中的Y可以有不同的属性名,但必须出自相同的域集。RS的除运算得到一个新的关系P(X),PR中满足下列条件的记录在X属性组上的投影:记录在X上分量值x的像集Yx包含SY上投影的集合。记作:

R÷S={tr[X]|trR∧∏y[S]⊆Yx}

其中,YxxR中的象集,x=tr[X]。

当然,可以这样理解关系除运算结果中的记录:对于除关系中的每一个记录,如果都能在被除关系中找到一个相应记录,它们分别与除关系中的记录在其属性上对应相等,且在剩余属性上的值也都对应相等,则其中任何一个记录的剩余属性值就形成了结果关系中的一个记录。

2.1.3 关系演算

对于关系数据的查询,除了可以用关系代数表达式表示以外,还可以采用数理逻辑中的一阶谓词演算表示,这就是关系演算。和关系代数相比,关系演算是一种高度非过程化语言。在RDBS操作中,根据谓词变元的不同关系演算分为记录关系演算和域关系演算两种方式。

1.记录关系演算

记录关系演算的最初定义是由E.F.Codd在1972年给出的。记录关系演算以记录变量作为谓词变元的基本对象。一种典型的记录关系演算语言是E.F.Codd提出的ALPHA语言。这一语言虽然没有实际实现,但为关系型数据库管理系统INGRES所用的QUEL语言提供了有益的借鉴,其QUEL语言的最终形式与ALPHA十分类似。其一般形式为{t|P(t)}。其中,t为记录变量,|P(t)为关系演算公式。

将5种基本的关系运算用记录演算求达式表示如下:

(1)并:RS={t|R(t)∨S(t)}

(2)差:RS={t|R(t)∧¬S(t)}

(3)笛卡儿积:

  R×S={t(n+m)|(∃u(n))(∃v(m))(R(u)∧(S(v)∧t[1]=u[1]∧…∧t[n]=u[n]∧t[n+1]=v[1]∧…∧t[n+m]=v[m])}

注意:R×S后所生成的新关系是n+m目关系;②前n个属性取R的属性名,并冠以R,后m个属性取S的属性名,并冠以S;③若两个关系中的某个属性没有同名,可直接引用该属性名;④处理一个关系R和其自身的乘积时,需要为关系R引入一个别名。

(4)投影:

i1,i2,…,ik(R)={t(k)|(∃u)(R(u)∧t[1]=u[i1]∧…t[k]=u[ik])}

(5)选择:σF(R)={t|R(t)∧F(t)}

例如,以student数据库为例,写出下列查询需求的记录关系演算表达式。

查询学生号为20120001的学生的信息:

{t|student(t)∧t(SNo)='20120001'}

2.域关系演算

在域关系演算中,表达式中的域变量是表示域的变量,可将关系的属性名视为域变量,抽象域演算表达式的一般形式为:

{〈t1,t2,…,tk〉|P(〈t1,t2,…,tk〉|)}

其中,t1,t2,…,tk是域变量,P(〈t1,t2,…,tk〉)是域演算公式。

(1)P(〈t1,t2,…,tk〉):P是关系名,ti是域变量,表示“Pk元关系,由分量t1,t2,…,tk组成的一个记录”。

(2)tiθtj:表示“域变量ti与域变量tj之间满足θ关系”。

(3)tiθa:表示“域变量ti与常量a之间满足θ关系”。

关系的5种基本运算用域关系演算表达式表示如下(设RS都是属性名相同的二元关系):

RS:{x|R(x)∪S(x)}

RS:{xy|R(xy)∩¬S(xy)}

R×S:{wxyz|R(wx)∩S(yz)}

σF(R):{xy|R(xy)∩F'} (F'是F的等价表示形式)

∏(R):{y|R(xy)}

关系代数、记录演算、域演算3类关系运算的表达能力是等价的,可以互相转换。

3.关系运算的安全约束

(1)安全表达式

在关系演算中,一些运算或表达式可能产生无穷关系和无穷运算。例如,记录表达式{tR(t)}表示所有不属于R的记录组成的集合,这是一个无限关系,在计算机中是无法存储的,而验证公式∀uP(u)为真也是不可能的。所以必须排除这类无意义的表达式,把不产生无限关系的表达式称为安全表达式。

在关系代数中,基本操作是并、差、笛卡儿积、投影和选择,没有集合的“补”操作,因而关系代数是安全的。

2)关系运算的安全限制

关系运算的安全限制是对关系演算表达式施加某些限制条件,对表达式中的变量取值规定一个范围,使之不产生无限关系和无穷运算的方法,有安全约束的措施,关系演算表达式才是安全的。

对于关系运算中可能产生无意义的表达式,其解决办法是:对于任何一个表达式{t|Φ(t)}都规定一个有限符号集DOM(Φ),使Φ的演算结果、中间结果所产生的关系及记录的各个分量都必须属于DOM(Φ)。

可以证明以下3个结论:

(1)每一个关系代数表达式有一个等价的、安全的记录演算表达式;

(2)每一个安全的记录演算表达式有一个等价的、安全的域演算表达式;

(3)每一个安全的域演算表达式有一个等价的关系代数表达式。