数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。数据结构用来确定数据库对象以及对象之间联系的描述和组织方式。数据操作是数据库中各种对象允许执行的操作的集合,包括操作语言及有关的操作规则。数据的完整性约束条件是一组完整性规则的集合,是对给定的数据模型中的数据及其联系所具有的约束条件的描述。本节以关系模型三要素为主线,主要介绍关系数据结构和关系数据操作,完整性约束条件将在第2.2节介绍。
在关系模型中,无论是实体集,还是实体之间的联系均采用单一的结构类型——关系来描述。那么关系如何表示呢?关系模型建立在集合代数的基础之上,因而需要从集合论的角度对关系数据结构进行形式化定义。为了说明这些,首先介绍一组相关概念。
1.域(Domain)的定义
定义2.1 域是一组具有相同数据类型的值的集合。
例如:整数、实数、{0,1}、{王铁,何芳,童星}、{计算机导论,数据库原理与技术,操作系统}、计算机专业所有学生的姓名等,都可以是域。域用来表明所定义属性的取值范围。每个域都有一个域名,域中不同数据元素的个数称为域的基数。如:
D 1 ={王铁,何芳,童星},表示学生姓名的集合。
D 2 ={计算机导论,数据库原理与技术,操作系统},表示课程的集合。
D 3 ={231101,231102},表示班级的集合。
上述 D 1 , D 2 , D 3 表示域,其中 D 1 和 D 2 的基数为3, D 3 的基数为2。
2.笛卡儿积(Cartesian Product)的定义
笛卡儿积是域上的一种集合运算。
定义2.2 给定一组域 D 1 , D 2 ,…, D n ,在这些域中,允许部分域相同,则 D 1 , D 2 ,…, D n 的笛卡儿积为
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 )称为一个 n 元组( n -Tuple),简称元组(Tuple)。元素中的每个值 d i ( i= 1,2,…, n )称为一个分量。
若 D i ( i= 1,2,…, n )为有限集,其基数为 m i ( i= 1,2,…, n ),则 D 1 × D 2 ×…× D n 的基数为
笛卡儿积可以表示为一个二维表,表中的每行对应一个元组,每列对应一个域。例如给出三个域:
D 1 =姓名={王铁,何芳,童星}
D 2 =专业={计算机科学与技术,信息管理与信息系统}
D 3 =性别={男,女}
则 D 1 , D 2 , D 3 的笛卡儿积如表2-1所示。
表2-1 D 1 , D 2 , D 3 的笛卡儿积
从表2-1可以看出,笛卡儿积中会包含一些无意义的元组。因为一个学生的专业和性别只能是其中一个,因此,表2-1中的一个子集才是有意义的。
3.关系(Relation)的定义
笛卡儿积的有限子集称为对应域上的关系。
定义2.3 D 1 × D 2 ×…× D n 的子集称作在域 D 1 , D 2 ,…, D n 上的关系,表示为
R ( D 1 , D 2 ,…, D n )
其中 R 表示关系的名字, n 表示关系的目或度。关系是笛卡儿积的子集,因此关系也是一个二维表格。由于域可以相同,为了加以区分,必须为每列起一个名字,称为属性。可以从表2-1中取出一些具有实际意义的元组构成学生关系,如表2-2所示。
表2-2 学生关系
4.关系模式(Relation Schema)的定义
在数据库中要区分数据的型和值。在关系型数据库中,关系是值(不稳定的),关系模式是型。关系模式是对关系的描述。现实世界随着时间在不断变化,因而在不同时刻属于同一关系模式的关系也会有所变化。关系模式是静态的、稳定的,而关系是动态的、随时间变化的。
定义2.4 关系模式可以形式化地描述为
R ( U , D , DOM , F )
其中 R 表示关系的名字, U 为组成该关系模式的属性名集合, D 为 U 中属性所取值的域的集合, DOM 为属性到域的映射关系, F 为属性间数据的依赖关系集合。关系模式通常可以简单记为
R ( U )或 R ( A 1 , A 2 ,…, A n )
其中 R 为关系名, A 1 , A 2 ,…, A n 为属性名,属性到域的映射关系通常直接说明为属性的类型和长度。
例如描述学生关系的关系模式可以为:
学生(姓名char(10),专业varchar(15),班级char(1))。
5.关系相关术语
(1)元组 关系表中每一行称作一个元组,组成元组的元素称为分量。现实世界中的一个实体或实体间的联系通常使用一个元组表示。如在表2-2中,(王铁,计算机科学与技术,男)为一个元组,由三个分量构成。
(2)属性 关系中的每一列称为属性。属性具有型和值的区别。属性的型是指属性名,而属性的值是指该属性具体的取值。关系中通常具有多个属性,分别用于描述实体某方面的特征。如学生关系中有“姓名”“专业”和“性别”三个属性。
(3)候选码和主码 关系中的一个或一组属性,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码。如学生关系中假定没有重名的情况,“姓名”为该关系的候选码。如果在学生关系中增加“学号”属性,由于每个学生的学号不会重复,则“学号”也为该学生关系的候选码。当一个关系有多个候选码时,选定其中一个候选码作为关系的主码。如在学生关系中可选择“学号”属性作为主码。
(4)主属性和非主属性 包含在候选码中的属性称为主属性,不包含在任何候选码中的属性称为非主属性。
(5)外码 关系 R 中的一个或一组属性,它不是 R 的候选码,但它与另一个关系 S 的候选码相对应,则称这个属性或属性组为 R 的外码或外键,并称关系 R 为参照关系,关系 S 为被参照关系。例如合同(合同号,合同名称,合同签订人,客户号)关系中合同号为候选码,客户(客户号,客户名称,客户地址,联系方式)关系中客户号为候选码。合同关系中的客户号不是该关系的候选码,但与客户关系的候选码相对应,则客户号为合同关系的外码。
6.关系的性质
关系有如下6条性质:
1)列的同质性。即每一列中的分量是属于同一数据类型的,来自同一域。
2)列名唯一性。即关系中不同的属性可以来自同一域,但不同的属性要给予不同的属性名称以做区分。
3)元组相异性。即关系中不允许存在两个完全相同的元组。从语义角度看,关系中的每一个元组代表现实世界中一个可区分的实体,不可能出现完全相同的两个实体。
4)列的无序性。即关系中列的次序是可以任意交换的。
5)行的无序性。即关系中行的次序是可以任意交换的。
6)分量原子性。即分量值是原子的,每一个分量必须是不可再分的数据项。从二维表的结构讲,不能出现表中套表的情况。
在关系模型中,常用的关系操作包括数据查询、数据控制和数据操纵。数据查询是指对数据进行检索、排序、分组等,以满足用户对信息查询的需求。数据控制是为了保证数据的安全性和完整性而采取的数据存取控制。数据操作是指对数据进行增加、删除、修改等数据更新操作。关系模型不对关系型数据库管理系统语言做具体的语法要求,即不同的关系型数据库管理系统可以定义和开发不同的语言来实现这些操作。
关系代数是关系数据操作的一种传统表达方式,是一种抽象的查询语言,用对关系的运算来表达查询。关系代数的运算对象是关系,运算结果也是关系,关系代数所使用的运算符包含两类:传统集合运算符和专门的关系运算符,如表2-3所示。
表2-3 关系代数运算符
1.传统集合运算
传统的集合运算包括并、差、交、笛卡儿积4种运算。当其中并、差、交运算符作用于关系时,要求参与运算的两个关系必须是相容的,即两个关系的列数是相同的,且对应的属性列都来自同一个域。
设关系 R 和 S 都具有 n 个属性,且相应的属性取自同一个域, t 是元组变量, t∈R 表示 t 是 R 的一个元组。
(1)并(Union)关系 R 和 S 的并运算可以表示为
R∪S= { t | t∈R∨t∈S }
其结果仍是 n 目关系,由属于 R 或属于 S 的元组构成。
(2)差(Except)关系 R 和 S 的差运算可以表示为
R-S= { t | t∈R∧t∉S }
其结果仍是 n 目关系,由属于 R 而不属于 S 的元组构成。
(3)交(Intersection)关系 R 和 S 的并运算可以表示为
R∩S= { t | t∈R∧t∈S }
其结果仍是 n 目关系,由属于 R 且属于 S 的元组构成。
(4)笛卡儿积(Cartesian Product)另设 R 为 m 1 目的关系,有 n 1 个元组, S 为 m 2 目的关系,有 n 2 个元组。笛卡儿积的结果关系为一个 m 1 + m 2 目的新关系,有 n 1 × n 2 个元组。每个元组前 m 1 列为关系 R 的一个元组,后 m 2 列为关系 S 的一个元组。可表示为
例2.1 已知关系 R 和关系 S 分别如图2-1a、b所示, R∪S 、 R-S 、 R∩S 和 R×S 的集合运算结果如图2-1c~f所示。
图2-1 传统集合运算示例
2.专门关系运算
专门关系运算包括选择、投影、连接、除等。设 t 为 R 的元组变量, R ( U )= R ( A 1 , A 2 ,…, A n ),则引入记号 t [ A ],表示关系 R 在属性(组) A 上的所有值。
(1)选择(Selection) 给定一个关系 R ,同时给定一个选择的条件condition(简记con),选择运算结果也是一个关系,记作 σ con ( R )。它从关系 R 中选择出满足给定条件condition的元组构成,从行的角度进行运算。
σ con ( R )={ t | t∈R∧ con( t )=True}
其中con由属性名(值)、比较运算符、逻辑运算符等构成。
(2)投影(Projection) 给定一个关系 R ,投影运算结果也是一个关系,记作 Π A ( R ),表示为
Π A ( R )={ t [ A ]| t∈R }
投影运算是从列的角度进行的运算,可对原关系的列进行重新排列。
例2.2 已知关系 R 如图2-2a所示,则选择运算 σ A= ' a 1' ( R )和投影运算 Π B , C ( R )的结果如图2-2b、c所示。
图2-2 选择、投影运算示例
(3)连接(Join) 连接运算也可称为
θ
连接。给定关系
R
和关系
S
,
R
与
S
的
θ
连接运算结果也是一个关系,记作
,它由从关系
R
和关系
S
的笛卡儿积中选取的
R
中属性
A
与
S
中属性
B
之间满足
θ
条件的元组构成。
上式可用关系代数表示为
其中 A 与 B 分别为关系 R 和关系 S 上列数相等且可比的属性组。
常用的连接如下:
1)等值连接。当关系 R 中属性 A 与关系 S 中属性 B 作等值比较时为等值连接,即 θ 为“=”的连接。可以表示为
2)自然连接。它是一种特殊的等值连接,要求参与连接运算的两个关系进行比较的分量必须是相同的属性组,同时,在结果中把相同的属性去掉。若关系 R 和关系 S 相同的属性组为 B ,则自然连接可表示为
例2.3 已知关系 R 和关系 S 如图2-3a、b所示, R 和 S 的 θ 连接如图2-3c所示,等值连接如图2-3d所示,自然连接如图2-3e所示。
图2-3 不同连接运算示例
关系 R 和关系 S 做自然连接时,在公共属性上取值相同的元组会被保留组成新的关系。此时,若关系 R 中的某些元组在关系 S 中找不到公共属性取值相同的元组,那么这些元组在运算结果中会被舍弃。同样,如果关系 S 中存在这样的元组,那么这些元组在运算结果中也会被舍弃。这些被舍弃的元组称为悬浮元组。例如,在图2-3e的自然连接中,关系 R 中的第5个元组和关系 S 的第3个元组都是悬浮元组。
如果要把悬浮元组也保留在结果中,在其他属性上的取值为空值(NULL),那么这种连接称为外连接,记作
R
S
;如果只保留左边关系
R
中的悬浮元组称作左外连接,记作
R
S
。如果只保留右边关系
S
中的悬浮元组称作右外连接,记作
R
S
。图2-4a是图2-3中关系
R
和关系
S
的外连接,图2-4b是左外连接,图2-4c是右外连接。
图2-4 外连接运算示例
(4)除(Division) 给定关系 R ( X , Y )和关系 S ( Y , Z ),其中 X , Y , Z 为属性组。 R 中的 Y 和 S 中的 Y 可以有不同的属性名,但必须来自同一个域。 R 与 S 的除运算得到一个新的关系 P ( X ), P 是 R 中满足下列条件的元组在 X 属性列上的投影:元组在 X 上的分量值 x 的象集 Y x 包含 S 在 Y 上的投影。可以表示为
R÷S= { t r [ X ]|( t r ∈R )∧ Π Y ( S )⊆ Y x }
其中 Y x 为 x 在 R 上的象集, x=t r [X] 。
求 R÷S 的步骤可以分解为
1)求 Π X ( R );
2)求 Π Y ( S );
3)求 Y x ,即 x 在 R 上的象集,它表示 R 中属性组 X 上的值 x i 的诸元组在 Y 上分量的集合。
求象集 Y x 的方法,对于每个分量值 x i , x i ∈Π X ( R ),求 Π Y ( σ X=xi ( R ))。
4) R÷S 的运算结果为:象集 Y x 包含了 Π Y ( S )的 x i 。
例2.4 设关系 R ( A , B , C )和关系 S ( B , C )如图2-5所示,计算 R÷S 的结果。
解 分析 R 中的属性并划分为 X , Y 两部分,其中 A 对应 X , B 与 C 对应 Y 。
1)求 Π A ( R )。 Π A ( R )={ a 1 , a 2 , a 3 , a 4 },即在关系 R 中, A 可以取4个值。
2)求 Π B , C ( S )。关系 S 在( B , C )上的投影为{( b 1 , c 1 ),( b 2 , c 2 )}。
3)求 a i 在 R 中的象集 BC ai ( i= 1,2,3,4)。
当 A 取值为 a 1 时, Y a 1 对应的象集为{( b 1 , c 1 ),( b 2 , c 2 ),( b 3 , c 3 )};
当 A 取值为 a 2 时, Y a 2 对应的象集为{( b 2 , c 2 )};
当 A 取值为 a 3 时, Y a 3 对应的象集为{( b 3 , c 3 )};
当 A 取值为 a 4 时, Y a 4 对应的象集为{( b 4 , c 4 )};
显然只有当 A 取值为 a 1 时, Y a 1 对应象集包含 Π B , C ( S )。所以 R÷S 结果为{ a 1 }。
图2-5 除运算示例
3.关系代数应用示例
例2.5 设有一个SPJ数据库,包括S、P、J及SPJ共4个关系,S(Sno,Sname,Status,City)、P(Pno,Pname,Color,Weight)、J(Jno,Jname,City)、SPJ(Sno,Pno,Jno,QTY)。其中,供应商表S由供应商代码(Sno)、供应商名(Sname)、供应商状态(Status)和所在城市(City)组成。零件表P由零件代码(Pno)、零件名(Pname)、颜色(Color)和重量(Weight)组成。工程项目表J由工程项目代码(Jno)、工程项目名(Jname)和工程项目所在城市(City)组成。供应情况表SPJ由供应商代码(Sno)、零件代码(Pno)、工程项目代码(Jno)、供应数量(QTY)组成,QTY表示某供应商供应某种零件给某工程项目的数量。今有若干数据如下,写出下列查询的关系代数表达式。
(1)求供应工程J1零件的供应商代码Sno。
Π Sno ( σ Jno='J1' (SPJ))
(2)求供应工程J1零件P1的供应商代码Sno。
Π Sno ( σ Jno='J1' ∧ Pno='P1' (SPJ))
(3)求供应工程J1红色零件的供应商代码Sno。
Π Sno ( Π Sno,Pno ( σ Jno='J1' (SPJ))▷◁ Π Pno ( σ Color='红' (P)))
(4)求没有使用天津供应商生产的红色零件的工程项目代码Jno。
Π Jno (J) -Π Jno ( Π Sno ( σ City = '天津' (S))▷◁ Π Sno,Pno,Jno (SPJ)▷◁ Π Pno ( σ Color='红' (P)))
(5)求至少使用了供应商S1所供应的全部零件的工程项目代码Jno。
Π Jno,Pno (SPJ)÷ Π Pno ( σ Sno = 'S1' (SPJ))