2.1 关系数据模型

关系数据模型(也可以简称为关系模型)涉及许多概念和技术,为了全面地掌握关系数据模型,应从数据模型的定义及三要素(数据结构、数据操作、数据约束)来理解关系数据模型。

2.1.1 关系数据模型的定义

数据模型是描述现实世界实体、实体间联系和约束的模型。可以参照数据模型的定义,给出关系数据模型的定义。

定义2.1(关系数据模型):关系数据模型(relational data model)是以规范化的二维表格结构表示实体集,以外码表示实体间联系,以三类完整性表示语义约束的数据模型。

图2-1给出了关系数据模型概念的一个示例。在关系数据模型中,所有的实体都在一个二维表格结构中,每一个实体为表格中的一行,称为一个元组(tuple)。所有元组的集合构成了一个关系(relation)。表格的表头给出了所有元组的语义,因此它代表整个关系的模式,在关系数据模型中称为关系模式(relational schema)。表格的每一列称为一个属性(attribute),元组的每一个分量称为一个属性值。

下面给出关系数据模型涉及的一些术语的定义。

图2-1 关系数据模型概念示例

1.元组

二维表格的每一行称为一个元组,它是一个属性值的集合。元组的数目称为关系的基数(cardinality)。关系数据模型中的元组代表现实世界中可唯一区分的实体,知道这一点有助于理解关系数据模型的基本性质。

元组本质上是数据,是值的集合,确切地说,是一系列属性值的集合。

2.属性

二维表格的每一列称为一个属性。属性有一个属性名及相应的域(domain)。域是一组具有相同数据类型的值的集合,它表示属性取值的范围。属性的数目称为关系模式的度(degree)。

3.关系

在关系数据模型中,关系是元组的集合。因此,关系代表一个实体的集合。与元组一样,关系表达的也是数据的概念,是一个值的集合。

从形式上看,关系是二维表格中除了表头部分的数据行集合。关系是关系数据模型中表示和组织数据的唯一形式。这一结构与网状数据模型的网络结构、层次数据模型的层次结构,以及面向对象数据模型的对象结构相比要简单得多。需要说明的是,虽然面向对象数据模型中的基本数据结构——对象,与关系数据模型中的元组类似,但对象之间存在继承、聚合、引用等复杂联系,因此要比关系复杂许多。

4.关系模式

我们知道,数据和语义是不可分的,脱离了语义的数据是没有实际意义的。关系的语义通过关系模式来定义。关系模式描述了关系的逻辑结构和特征,从形式上看它对应了二维表格的表头。

关系模式在关系数据模型中有着严格的定义(我们将在2.1.3节中详细讨论)。在某些情况下,关系模式可以简化表示为一个属性集合,例如学生关系模式可简化表示为Student(sno,name,age,gender)。

5.关系数据库模式

关系数据库模式描述了整个关系数据库的逻辑结构和特征。关系数据库模式是由若干关系模式构成的一个集合,其中每一个关系模式都描述了某一类实体的逻辑结构和特征。

因此,如果要针对某个特定应用设计它的关系数据库模式,就需要将该应用涉及的所有实体的关系模式分别设计出来。所有的关系模式设计完成后,就自然而然地得到了整个关系数据库模式。本书后面的数据库设计部分就遵循了这样的思路。

6.关系数据库

关系数据库模式的一个实例称为关系数据库。所以说,关系数据库对应的是数据的概念,是关系的集合。

7.码

关系数据模型中存在几个码的概念。首先是超码(super key),超码是关系模式中能够唯一区分每个元组的属性集合。其次是候选码(candidate key),不含多余属性的超码称为候选码,所以候选码是唯一区分元组的最小属性集。一个关系模式中有可能存在多个候选码。例如,在一个学生关系模式中,学号和身份证号都可以唯一区分学生,因此都是候选码。包含在某个候选码中的属性称为关系模式的主属性(primary attribute),主属性之外的属性称为关系模式的非主属性(nonprime attribute)。主属性和非主属性的概念在数据库模式设计中将会用到,此处不展开讨论。最后一个概念是主码(primary key)。在实际的数据库设计中,用户选定作为元组标识的候选码称为主码,其他的候选码则称为替换码(alternate key)。替换码在实际应用中很少使用,此处只需要知道这一概念即可。如果一个关系模式只存在一个候选码,则此唯一的候选码必定是主码。主码在本章的图中以属性名下方加下划线表示。

例如,假设有学生关系模式Student(sno,name,libraryID,age,gender),其中sno是学号,libraryID是借书证号,则(sno,name)和(libraryID,age)都是超码。当然还有许多其他超码,这里就不一一罗列了。候选码有两个,即sno和libraryID,这两个属性都可以唯一地标识一个元组,并且不含多余属性。如果用户选择sno作为该关系模式的主码,则libraryID是替换码;如果选择libraryID作为主码,则sno是替换码。

2.1.2 关系的基本性质

关系数据模型以二维表格形式为基本数据结构表示现实世界中的实体,但关系并非普通的二维表格,它必须满足一定的规范,因此我们称关系是规范化的二维表格。在关系数据模型中,二维表格的这些规范表现为关系的下列基本性质。

1.属性值不可分解

这是指每个属性值都是单一的值,不能是一个值集。通俗地讲,就是不允许关系表中有表。如果允许关系的属性值是一个值集,则会出现所谓的更新二义性问题。

2.元组不可重复

这是指任一关系中都不允许存在重复的元组。这也意味着任何一个关系模式必定存在至少一个超码(或候选码)。在极端情况下,关系模式的整个属性集肯定可以唯一地标识元组,因此是关系模式的超码。

为什么关系数据模型要求元组不可重复?这是因为关系数据模型的基本思路是用元组来表示现实世界中的实体。而现实世界中的实体都是可唯一区分的,因此,关系数据模型才有如此规定。这是它的建模基础。

3.关系没有行序

这是指任何关系的元组之间没有顺序,因此颠倒某一关系中的元组顺序并不会产生一个新的关系——两者之间是等价的。

关系没有行序这一性质的根源在于关系是元组的集合。也就是说,关系数据模型是以集合论为基础来表示关系的。我们知道,集合中的元素是没有顺序的,因此,关系作为元组的集合其元素当然也是没有顺序要求的。

4.关系没有列序

这是指任一关系的属性列之间没有顺序,因此可以任意变动一个关系的列序而不会对该关系有任何改变。

关系没有列序的根源仍在于关系数据模型基于集合论这一事实。由于一个元组是属性值的一个集合,因此属性值之间的顺序可以随意变换而不会改变集合的值。

2.1.3 关系模式

关系模式描述了关系的逻辑结构和特征。如前所述,关系模式对应着二维表格的表头,它给出了关系中每一个元组及属性值的语义。在关系数据模型中,关系模式有着严格的形式化定义。它也是关系数据库模式设计的理论基础。

定义2.2(关系模式):关系模式可以形式化定义为一个四元组R(U,D,dom,F)。其中,R为关系模式名;U是一个属性集;D是U中属性的值所来自的域;dom是属性向域的映射集合;F是属性间的数据依赖关系。

例如,一个学生关系模式可以形式化定义为Student(U,D,dom,F),其中,

在这个例子中,Student关系模式的数据依赖集表示为F,它包含了两个函数依赖(函数依赖的概念会在后面介绍),反映了Student的三个属性之间的数据依赖关系。关系模式的形式化定义使我们可以很好地描述关系的逻辑结构特征。一般情况下,如果不需要对关系模式的数据依赖进行处理,则可以将关系模式简写为R(U),或者R(A1,A2,…,An),其中U是属性集,U={A1,A2,…,An}。例如,Student关系模式可以简写为Student(sno,name,age)。

2.1.4 关系数据模型的形式化定义

关系数据模型的概念及特点可以通过数据模型的三要素来掌握,三要素即数据结构、数据操作和数据约束。因此,本小节从数据结构、数据操作和数据约束三个方面给出关系数据模型的形式化定义。

1.数据结构

关系数据模型只有唯一的一种数据结构,即关系。关系数据库中的全部数据及数据间联系都以关系来表示。

2.数据操作

关系数据模型中,所有数据(即关系)通过关系运算来操作。关系运算有两种类型:关系代数和关系演算。关系代数是以集合操作为基础的,而关系演算是以谓词演算为基础的。关系演算又有两种类型:元组关系演算和域关系演算。元组关系演算以元组为变量,而域关系演算是以属性为变量。目前已经证明,元组关系演算和域关系演算是等价的,而关系代数与关系演算也是等价的。

关系代数是关系数据模型数据操作的主要实现方式。在关系数据模型中,所有数据都表示为关系,而关系代数则是实现对关系的增、删、改、查等操作的一个操作集合。关系代数通过关系代数表达式来表达用户对关系的操作需求。关系代数在关系上是封闭的,即任何关系代数操作在关系上的运算结果仍然是关系。关系代数的封闭性保证了关系代数操作的可嵌套性。在关系数据模型中,正是由于关系代数的可嵌套性,导致在用关系代数表达用户的操作需求时可能比较困难,关系代数操作层层嵌套,使得关系代数表达式异常复杂。

在早期的关系数据模型中,Edgar F.Codd定义了4种集合操作及4种专门的关系代数操作,本书将这8种操作称为原始的关系代数。与此相对的是附加的关系代数,它们是研究者们针对原始关系代数的不足而提出的扩展。无论是原始的关系代数还是附加的关系代数,目前在商用DBMS上,除了少数一些操作外基本都是支持的。因此,本书将对原始关系代数和附加关系代数都进行详细的讨论。

图2-2给出了关系代数的基本组成。从图中可以看出,原始关系代数包括了4个传统的集合操作——并、交、差、笛卡儿积,以及4个专门的关系代数操作——选择、投影、连接、除;附加关系代数包括了6种操作,即重命名、广义投影、聚集、分组、排序和赋值。需要指出的是,附加关系代数操作是人们后来补充的,并不只有这6种操作。

3.数据约束

在关系数据模型中,数据约束通过三类完整性约束来表达,即实体完整性、参照完整性和用户自定义完整性,它们可以很好地表示在关系数据模型中实体和实体间联系表达时应遵循的语义约束。

定义2.3(实体完整性):实体完整性(entity integrity)是指关系模式R的任一关系的主属性值不可为空。

图2-2 关系代数的基本组成

注意:实体完整性要求关系模式的任一实例的所有主属性均不可取空值,而不仅是主码不为空。

建立数据库的目的就是想将现实世界中的真实情况存储到计算机系统中。如果存储在数据库中的数据与现实世界的真实情况矛盾,就会大大降低数据库的可用性,因为对用户来说这些数据都是虚假的数据。实体完整性为数据库系统提供了保证实体可标识性的一种有效手段。目前商用的DBMS都支持实体完整性的定义和实现。

参照完整性定义在两个关系模式之上。要理解参照完整性,首先需要了解外码的概念。回顾一下关系数据模型的定义,它是以外码来表示实体间联系的。

定义2.4(外码):关系模式R的外码(foreign key)是它的一个属性集FK,满足:

1)存在带有候选码CK的关系模式S,且

2)R的任一非空FK值在S的CK中都有一个相同的值。

我们把S称为被参照关系(referenced relation),R称为参照关系(referential relation)。

定义2.5(参照完整性):关系模式R的参照完整性(referential integrity)是指R的任意一个外码值必须等于被参照关系S中所参照的候选码的某个值,或者为空。

参照完整性完全是由关系模式的外码来定义的。参照完整性要求关系模式的外码要么为空(前提是外码不是主属性,因为要满足实体完整性),要么等于被参照关系中所参照的某个属性值。

实体完整性和参照完整性给出了针对主码和外码的语义约束,但实际应用还常要求对一些非码属性添加完整性约束条件。因此,在关系数据模型中,引入了第三类完整性约束——用户自定义完整性,用来表达根据应用环境要求而设定的语义约束。

定义2.6(用户自定义完整性):用户自定义完整性(user-defined integrity)是指关系模式针对某一具体数据的要求而制定的约束条件,反映某一具体应用所涉及的数据必须满足的特殊语义。

用户自定义完整性通常以不等式、等式等给出,并且可以通过逻辑操作符连接多个谓词条件。例如,对于选课关系中的“成绩”,某一应用环境可能要求“成绩”取值在[0,100]之间,在关系数据模型中可以使用“成绩>=0 AND成绩<=100”这样的表达式来定义完整性约束;而在另一应用中,“成绩”可能采用5分制,因此要求“成绩”取值只能是{1,2,3,4,5},这时可以使用“成绩IN{1,2,3,4,5}”这样的表达式来定义完整性约束。

2.1.5 关系代数表达式

关系代数是关系数据模型中数据操作的实现方式。关系代数只是给出了一个操作集合,在实际回复用户的查询时,关系数据模型是通过所谓的关系代数表达式来实现的。也就是说,在关系数据模型中所有的用户查询或者其他操作最终都是通过关系代数表达式来完成的。

定义2.7(关系代数表达式):

1)关系代数中的基本表达式是关系代数表达式,基本表达式由如下之一构成:

❑数据库中的一个关系;

❑一个常量关系。

2)设E1和E2是关系代数表达式,则下面的都是关系代数表达式:

❑E1∪E2、E1-E2、E1×E2;

❑σP(E1),其中P是E1中属性上的谓词;

❑πS(E1),其中S是E1中某些属性的列表。

在关系数据模型中,用户的所有数据操作请求最终都是通过关系代数表达式来表示的。下面分别给出了数据的查询、插入、删除和修改操作的关系代数表达式的例子。

1.数据的查询

【例2-1】设数据库中有下面的关系模式:

供应商关系模式为S(Sno,Sname,City,Status),其中各个属性分别表示供应商的供应商号、名称、所在城市、状态。

零件关系模式为P(Pno,Pname,Color,Weight),其中各个属性分别表示零件号、名称、颜色、重量。

供应关系模式为SP(Sno,Pno,QTY),其中Sno是外码并且参照S.Sno,Pno也是外码并且参照P.Pno,QTY为供应量。

下面是一些只涉及单个关系模式的简单查询的例子。

(1)求城市London中的供应商的全部信息

相应的关系代数表达式为σCity='London'(S)。

(2)求城市London中的供应商的供应商号、名称和状态

相应的关系代数表达式为πSno,Sname,Status(σCity='London'(S))。

(3)求红色并且重量为15的零件号和零件名

相应的关系代数表达式为πPno,Pname(σColor='Red'∧Weight=15(P))。

(4)求提供零件P2的供应商名称

相应的关系代数表达式为πSname(σPno='P2'(SSP))

(5)求提供红色零件的供应商名称

相应的关系代数表达式为πSname(σColor='Red'(SSPP))

2.数据的插入

数据的插入操作通过赋值和并操作来表达,即

R←R∪E

其中R是关系;E是关系代数表达式。如果E是常量关系,则可以插入单个元组。

【例2-2】设有关系模式S1和S2分别表示本科生数据和研究生数据,并且具有相同的模式,则把S1中满足条件P的本科生插入S2中可表示为

S2←S2∪σP(S1)

【例2-3】设学生关系模式为S(Sno,Sname,Age),则在S中插入一名新的学生可表示为

S←S∪{('001','Rose',19)}

3.数据的删除

数据的删除操作通过赋值和差操作来表达,即

R←R-E

其中R是关系;E是关系代数表达式。

【例2-4】设学生关系模式为S(Sno,Sname,Age),则在S中删除姓名为Rose的学生可表示为

S←S-σSname='Rose'(S)

4.数据的修改

数据的修改操作通过赋值和扩展投影来实现,即

R←πF1,F2,…,Fn(R)

其中Fi的定义为:当第i个属性没有被修改时是R的第i个属性;当被修改时是第i个属性和一个常量的表达式。如果只想修改R中满足条件P的部分元组,可以用下面的表达式:

R←πF1,F2,…,Fn(σP(R))∪(R-σP(R))

【例2-5】设学生关系模式为S(Sno,Sname,Gender,Age),则在每名学生的学号前加上字母S可表示为

S←π'S'||Sno,Sname Gender,Age(S)

在所有男学生的学号前加上字母M可表示为

S←π'M'||Sno,Sname Gender,Age(σGender='Male'(S))∪(S-σGender='Male'(S))