购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 关系模型原理

关系模型是一种采用关系二维表存储实体及实体间联系信息的数据模型。关系模型决定了关系数据库的数据组织与数据存取方式。学习者掌握关系数据库的前提是理解关系模型原理。

2.2.1 关系模型组成

关系模型与其他数据模型一样,也是由数据结构、操作方式、数据约束3个部分组成的。

1.数据结构

在关系模型中,采用具有关系特征的二维表数据结构来组织与存储数据。在关系数据库中,关系一般被称为关系表或表。一个关系数据库由若干关系表组成,并且表之间存在一定的关联,如图2-1所示。

图2-1 关系模型的数据结构

2.操作方式

在关系模型中,对关系表的数据操作是按照集合关系运算方式来进行的。常用的关系运算包括选择(Select)、投影(Project)、笛卡儿积(Cartesian Product)、连接(Join)、除(Divide)、并(Union)、交(Intersection)、差(Difference)等数据查询操作,也包含插入(Insert)、更新(Update)、删除(Delete)等数据操纵。2.2.2节将介绍关系模型的操作,3.3节将详细介绍数据操纵SQL语句。

3.数据约束

在关系模型中,关系模型的数据约束包括实体完整性约束、参照完整性约束和用户自定义完整性约束。其中,前两个约束是关系模型必须满足的限制条件,它们被关系DBMS默认支持。用户自定义完整性约束根据应用领域数据需遵循的业务规则,由具体业务的规则限定。

2.2.2 关系代数运算

在关系模型中,关系数据操作分为查询、插入、更新、删除等类型。其中查询数据有较多具体操作,如选择、投影、笛卡儿积、连接、除、并、交、差等,而插入、更新、删除操作类型相对单一。在关系模型中,关系数据操作采用关系代数方法或关系演算方法来实现。关系代数方法利用关系的代数运算来表达查询处理要求;关系演算方法利用谓词来表达查询处理要求。关系数据库使用一种介于关系代数和关系演算之间的数据操作语言(结构化查询语言)对关系表进行数据访问操作。结构化查询语言(Structured Query Language,SQL)作为关系数据库操作访问的标准数据操作语言,被广泛应用到各个关系数据库系统中。

关系模型的操作特点:数据操作的对象为关系中的元组,其操作结果也是元组。下面主要给出使用关系代数方法实现数据查询的操作原理。

关系代数是一种对关系进行查询操作的数学工具。关系代数的操作运算分为传统的集合运算和专门的关系运算两类。

1.传统的集合运算

传统的集合运算是二目运算,即对两个关系进行集合运算,其操作包括并、差、交、笛卡儿积4种运算。

这里假设参与运算的两个关系分别为 R S ,关系 R 和关系 S 都有 n 个属性,并且它们的属性列相同。

【例2-5】 关系 R 和关系 S 的数据初值如图2-2所示,以下分别对它们进行并、差、交、笛卡儿积运算。

图2-2 关系 R 和关系 S 的数据初值

a)关系 R b)关系 S

(1)并运算∪

关系 R 与关系 S 并运算的结果集合由属于 R 或属于 S 的元组组合而成,其运算结果仍为 n 元关系,记作式(2-1)。

式中, t 为元组。

关系并运算将两个表中元组进行合并,并消除重复元组。本例的运算结果如图2-3所示。

图2-3 R S 关系的结果

(2)差运算

关系 R 与关系 S 的差运算结果集合由属于 R 而不属于 S 的所有元组组成,其运算结果仍为 n 元关系,记作式(2-2)。

关系的差运算对应于关系表的元组裁剪,即从关系 R 中删除与关系 S 相同的元组。本例的运算结果如图2-4所示。

(3)交运算∩

关系 R 与关系 S 的交运算结果集合由既属于 R 又属于 S 的所有元组组成,其结果关系仍为 n 元关系,记作式(2-3)。

关系的交运算也可以用差来表示,即 R S = R -( R-S )。本例的运算结果如图2-5所示。

图2-4 R-S 关系的结果

图2-5 R S 关系的结果

(4)笛卡儿积×

假设关系 R n 个属性、关系 S m 个属性,则关系 R 和关系 S 的笛卡儿积是一个( n + m )列的元组集合。元组前 n 列是关系 R 的元组列,后 m 列是关系 S 的元组列。若 R k 1 个元组, S k 2 个元组,则关系 R 和关系 S 的笛卡儿积有 k 1 k 2 个组合元组。针对本例,关系 R 和关系 S 的笛卡儿积的运算结果如图2-6所示。

图2-6 R × S 关系的结果

关系 R 和关系 S 的笛卡儿积运算操作方式:从关系 R 的第一个元组开始,依次与关系 S 的每个元组组合,然后对关系 R 的下一个元组进行同样操作,直到关系 R 的最后一个元组进行同样操作,最后可得到 R × S 的全部元组。

2.专门的关系运算

传统的集合运算仅仅从关系表的元组角度进行处理,没有考虑关系表中属性列的处理。专门的关系运算将对传统集合运算进行扩展,其操作包括选择、投影、连接、除等,这些操作均对关系表的列进行操作处理。为了描述这些专门的关系运算,首先引入如下数学符号定义:

1)设关系模式为 R A 1 , A 2 ,…, A n )。 t R 表示 t R 的一个元组。 t [ A i ]则表示元组 t 中对应于属性 A i 的一个分量。

2)设 A ={ A i 1 , A i 2 ,…, A ik },其中 A i 1 , A i 2 ,…, A ik A 1 , A 2 ,…, A n 中的一部分,则 A 称为部分属性列。 则表示{ A 1 A 2 ,…, A n }中去掉{ A i 1 A i 2 ,…, A ik }后剩余的属性列。 t [ A ]=( t [ A i 1 ], t [ A i 2 ],…, t [ A ik ]),表示元组 t 在部分属性列 A 上各分量的集合。

3)设 R n 元关系, S m 元关系。若 t r R t s S ,则 t r t s 表示为元组的连接。它是一个( n + m )列的元组,前 n 个分量为 R 中的一个 n 元组,后 m 个分量为 S 中的一个 m 元组。

4)给定一个关系 R X , Y ), X Y 分别为 R 的属性组。当 t [ X ]= x 时, x R 中的象集记为式(2-4)。

该式表示 R 中属性组 X 上值为 x 的各元组在 Y 上分量的集合。

(1)选择运算

选择运算是在关系 R 中选择出满足给定条件 C 的元组集输出,记作式(2-5)。

式中, C 表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”; t R 中任意一个元组,把它代入条件 C 中,如果代入的结果为真,则这个元组就是σ C R )结果集中的一个元组,否则此元组就不在结果集中。

【例2-6】 有一个TEACHER(教师)关系表,见表2-4。

表2-4 TEACHER关系表

若要从关系表中查询出职称(Title)为“教授”的教师信息,其选择条件可以定义为Title='教授',选择运算的结果集见表2-5。

表2-5 σ Title='教授' (TEACHER)选择运算的结果集

(2)投影运算

投影运算是从关系 R 中选择出部分属性列输出一个结果集,记作式(2-6)。

式中, A R 中的部分属性列。

【例2-7】 在表2-4中,若需要查询出教师的联系邮箱(Email)信息,且其输出列表为 A ={TeacherNumber,Name,Email},则投影运算的结果集见表2-6。

表2-6 Π { TeacherNumber , Name , Email } (TEACHER)投影运算的结果集

(3)连接运算

关系的连接运算包括θ连接、自然连接和外连接。它们从两个关系的笛卡儿积中选取属性间满足一定条件的元组集合,然后输出结果集。

1)θ连接。θ连接运算是从 R S 的笛卡儿积中选取关系 R A 属性组上的值与关系 S B 属性组上的值满足比较关系θ的元组集合输出,记作式(2-7)。

式中, A B 分别为 R S 上度数相等且具有可以比较的属性组,θ为比较运算符,它包括{<,≤,=, >,≥}。

【例2-8】 关系 R 的元组数据为求职人员的薪水要求信息,关系 S 的元组数据为公司招聘职位的薪水标准信息,如图2-7所示。现在,需要找出公司招聘职位的薪水标准满足求职人员薪水要求的候选面试人员列表。

图2-7 求职人员与公司招聘职位关系

a)关系 R (求职人员)b)关系 S (公司招聘职位)

通过使用θ连接运算,即σ R .Wage≤ S .Salary ( R × S ),可以从关系 R 和关系 S 中得到所需要的结果数据,其运算的结果集如图2-8所示。

图2-8 σ R .Wage≤ S .Salary R × S )运算的结果集

当θ为“=”的连接运算符时,该θ连接运算又称为等值连接运算。它是从关系 R 与关系 S 的笛卡儿积中选取 A B 属性值相等的那些元组构成结果集。

2)自然连接。自然连接是一种特殊的等值连接运算,它要求两个关系中进行比较的分量必须是相同的属性组,并且还要在结果集中把重复的属性列去掉,记作式(2-8)。

【例2-9】 关系 R 为员工元组数据集,关系 S 为部门元组数据集,如图2-9所示。现在需要通过关系 R 与关系 S 进行自然连接运算操作,从而获得员工部门信息关系表。

图2-9 员工与部门关系

a)关系 R (员工)b)关系 S (部门)

使用自然连接运算即 R S ,并在结果集中删除重复的属性列,其运算的结果集如图2-10所示。

θ连接运算是从关系表的行角度进行运算的,而∞自然连接运算还消除了重复列,所以自然连接运算是同时从行和列的角度进行运算的。

3)外连接。前面提及的几个关系连接又被称为内连接,其运算操作结果集由两个关系中相匹配的元组组合而成。但在一些情况下,采用内连接关联操作的元组结果集,会丢失部分信息。

图2-10 员工与部门关系自然连接运算的结果集

【例2-10】 关系 R 为员工地址元组数据,关系 S 为员工薪水元组数据,如图2-11所示。通过关系 R 与关系 S 自然连接操作得到员工地址、薪水信息关系表,如图2-12所示。

图2-11 员工地址与员工薪水关系

a)关系 R (员工地址)b)关系 S (员工薪水)

图2-12 员工地址、薪水关系自然连接运算的结果集

从图2-12中不难发现,通过关系 R 与关系 S 自然连接运算操作,在所得到元组构成的新关系表中丢失了“张京”和“林平”的信息。其原因是关系 R 与关系 S 自然连接运算操作,去掉了在Name列中不匹配的元组数据。

外连接运算是内连接运算的扩展,它可以在内连接操作结果集的基础上,通过扩展关系中未匹配属性值的对应元组而形成最终结果集。使用外连接运算可以避免内连接运算可能带来的信息丢失。

外连接运算有3种形式,即左外连接、右外连接和全外连接。

①左外连接。在左外连接运算中,针对与左侧关系不匹配的右侧关系元组,用空值(NULL)填充所有来自右侧关系的属性列,再把产生的连接元组添加到自然连接的结果集中。图2-13给出了例2-10按左外连接运算的结果集。

图2-13 员工地址、薪水的左外连接运算结果集

②右外连接。在右外连接运算中,针对与右侧关系不匹配的左侧关系元组,用空值(NULL)填充所有来自左侧关系的属性列,再把产生的连接元组添加到自然连接的结果集中。图2-14给出了例2-10按右外连接运算的结果集。

③全外连接。在全外连接运算中,同时完成左外连接和右外连接运算,既使用空值(NULL)填充左侧关系中与右侧关系的不匹配元组,又使用空值填充右侧关系中与左侧关系的不匹配元组,再把产生的连接元组添加到自然连接的结果集中。图2-15给出了例2-10按全外连接运算的结果集。

图2-14 员工地址、薪水的右外连接运算结果集

图2-15 员工地址、薪水的全外连接运算结果集

(4)除运算

在给定关系 R X , Y )和关系 S Y , Z )中, X Y Z 分别为部分属性组。 R 中的 Y S 中的 Y 可以有不同的属性名,但必须来自相同的域集。关系 R 与关系 S 的除运算将得到一个新的关系 P X ),记为式(2-9)。

新关系 P X )是 R 中满足式(2-9)条件的元组在 X 属性组上的投影:元组在 X 上分量值 x 的象集 Y x 包含 S Y 上投影的集合。

【例2-11】 关系 R 、关系 S 数据如图2-16所示,试将它们进行除运算。

图2-16 关系 R 与关系 S

a)关系 R b)关系 S

本例的关系除运算过程如下:

第1步:找出关系 R 和关系 S 中相同的属性,即 Y 属性和 Z 属性。在关系 S 中对 Y 属性和 Z 属性做投影,所得结果为{( Y 2 , Z 2 ),( Y 2 , Z 1 ),( Y 3 , Z 2 )}。

第2步:被除关系 R 中与关系 S 中不相同的属性列是 X ,关系 R 在属性 X 上做取消重复值的投影为{ X 1 , X 2 , X 3 }。

第3步:求关系 R X 属性对应的象集 Y Z ,根据关系 R 的数据,可以得到 X 属性各分量值的象集。

X 1 的象集为{( Y 2 , Z 2 ),( Y 3 , Z 2 ),( Y 2 , Z 1 )}。

X 2 的象集为{( Y 3 , Z 3 ),( Y 1 , Z 2 )}。

X 3 的象集为{( Y 1 , Z 4 )}。

第4步:判断包含关系,对比即可发现 X 2 X 3 的象集都不能包含关系 S 中属性 Y 和属性 Z 的所有值,所以排除掉 X 2 X 3 X 1 的象集包含了关系 S 中属性 Y 和属性 Z 的所有值,所以 R ÷ S 的最终结果就是 X 1 ,如图2-17所示。

图2-17 R ÷ S 的结果

2.2.3 数据完整性约束

关系模型数据完整性是在关系数据模型中对关系数据实施的完整性约束规则,以确保关系数据的正确性和一致性。关系模型允许定义3种类型的数据完整性约束:实体完整性约束、参照完整性约束和用户自定义完整性约束。其中,实体完整性约束和参照完整性约束是关系模型必须满足的完整性约束;用户自定义完整性约束是在应用领域实施的业务规则。

1.实体完整性约束

在关系模型中,实体完整性约束是指在关系表中实施的主键取值约束,以保证关系表中的每个元组可标识。

约束规则:①每个关系表的主键属性列都不允许有空值(NULL),否则就不可能标识实体。②实体中各个实例靠主键值来标识,主键取值应该唯一,并区分关系表中的每个元组。

空值是一种“未定义”或“未知”的值。空值可使用户简化不确定数据的输入。

例如,在员工关系表EMPLOYEE( EmployeeID ,Name,Department,Email)中,工号(EmployeeID)作为主键,不能取空值,并且其取值应唯一。同样,在成绩关系表GRADE( StudentID,CourseID ,Score,Note)中,( StudentID,CourseID )作为复合主键,其每个属性都不能为空,并且复合主键取值唯一。

实体完整性约束检查:①检查主键值是否唯一,如果不唯一,则拒绝插入或修改元组数据。②检查主键的各个属性是否为空,只要有一个为空就拒绝插入或更新元组数据。

【例2-12】 在表2-7~表2-9的成绩关系表中,请判断哪些表符合实体完整性约束,哪些表不符合实体完整性约束。

表2-7 GRADE关系表1

表2-8 GRADE关系表2

表2-9 GRADE关系表3

在表2-7中,由于复合主键(StudentID,CourseID)在第2个元组中CourseID属性取值为空,因此,该关系表不满足实体完整性约束。

在表2-8中,由于第1个元组与第3个元组的主键取值重复,不能确定该学生课程成绩,因此,该关系表也不满足实体完整性约束。

在表2-9中,虽然第3个元组的学生成绩分数Score为空,但它不是主键,允许为空值,代表该生缺考。因此,该关系表满足实体完整性约束。

2.参照完整性约束

在关系模型中,参照完整性约束是关系之间的联系需要遵守的约束,以保证关系之间关联列的数据一致性。

约束规则:若属性(或属性组) F 在关系 R 中作为外键,它与关系 S 的主键 K 相关联,则 R 中的每个元组在 F 的取值都应与关系 S 中的主键值匹配。

在一种通过主键属性相关联的两个关系表中,该主键属性在一个表中作为主键,对应在另一个表中则作为外键。

例如,员工关系表EMPLOYEE( EmployeeID ,Name, DepartName ,Email)与部门关系表DEPARTMENT( DepartName ,TelePhone)通过DepartName列进行关联。在DEPARTMENT关系表中,DepartName属性作为主键,而在EMPLOYEE关系表中,DepartName属性列作为外键。为了直观表示外键属性,通常在关系模式语句中,外键属性列名称采用斜体。

参照完整性约束检查:对存在通过主键列与外键列相关联的关系表中,无论是操作包含主键的关系表(主表)还是操作包含外键的关系表(子表)的元组数据,都应保证表之间关联列的数据一致性。下面情况会带来关联表的参照完整性问题:

1)修改主表中某元组的主键值后,子表对应的外键值未做相应改变,两表的关联列数据不一致。

2)删除主表的某元组后,子表中关联的元组未删除,致使子表中这些元组成为孤立元组。

3)在子表中插入新元组,所输入的外键值在主表的主键属性列中没有对应的值。

4)修改子表中的外键值,没有与主表的主键属性列值匹配。

因此,在关系模型中,需要根据实际应用需要,定义关联表之间的参照完整性约束规则。

【例2-13】 在员工关系表EMPLOYEE( EmployeeID ,Name, DepartName ,Email)和部门关系表DEPARTMENT( DepartName ,TelePhone)中,通过EMPLOYEE子表的外键( DepartName )参照DEPARTMENT主表的主键( DepartName ),可实施如下约束规则:

1)在对子表进行数据操作时,外键( DepartName )的取值或变更必须与主键(DepartName)的列值一致。例如,当在EMPLOYEE中添加一个新员工元组数据时,其外键( DepartName )的取值必须是部门关系表DEPARTMENT的主键(DepartName)中已存在的值。此外,在EMPLOYEE中更新员工的部门信息时,外键( DepartName )的取值也必须是部门关系表DEPARTMENT的主键(DepartName)中已存在的值。

2)主表元组删除或主键值变更,子表中参照的外键值对应变更,要么取空值,要么引用主表中存在的主键值,以保持关联表数据一致。例如,删除DEPARTMENT主表中的一条元组,即删除一个部门名称,则子表EMPLOYEE中凡是外键值为该部门名称的元组也必须同时被删除,此操作被称为级联删除。如果更新DEPARTMENT主表中的主键值,则子表EMPLOYEE中相应元组的外键值也随之被更新,此操作被称为级联更新。

3.用户自定义完整性约束

用户自定义完整性约束是指用户根据具体业务数据处理要求,对关系中属性施加的数据约束。通过在关系中自定义完整性约束,可以确保关系中的数据满足业务数据处理要求。

【例2-14】 在表2-10的GRADE关系表中,业务要求Score的取值范围限定为0~100或空值,不允许输入其他数据值。

表2-10 GRADE关系表

关系DBMS为用户提供了定义和检验完整性的机制,并提供统一的完整性处理功能,不需要用户额外的编程处理。关系DBMS可以允许用户实现如下自定义完整性约束:

1)定义域的数据类型与取值范围。

2)定义属性的数据类型与取值范围。

3)定义属性的默认值。

4)定义属性是否允许取空值。

5)定义属性取值的唯一性。

6)定义属性间的数据依赖性。

课堂讨论:本节重点与难点知识问题

1)关系模型的工作原理是什么?在国产关系数据库研发中,如何实现关系DBMS自主创新?

2)在关系模型中,对关系有哪些数据操作方式?

3)如何理解关系的选择运算操作、投影运算操作、连接运算操作?

4)关系之间的θ连接操作与自然连接操作有何区别?

5)关系之间的左外连接、右外连接、全外连接有何区别?

6)如何理解关系的实体完整性约束和参照完整性约束? TYaax1gYrpBXiWe2QQce2DXdVqrEFIjzMOek7Cn3bSvAKqUIB7kF+Ah7C/ftRP3i

点击中间区域
呼出菜单
上一章
目录
下一章
×