13.1.2 关系数据库
1.关系模型概述
关系数据库应用数学方法来处理数据库中的数据。多年来,关系数据库系统的研究取得了辉煌的成就。关系方法从实验室走向了社会,涌现出许多性能良好的商品化关系数据库管理系统(简称RDBMS),如DB2、Oracle、Ingres、Sybase、Informix等,数据库的应用领域迅速扩大。
关系数据库系统是支持关系模型的数据库系统。关系模型由关系数据结构、关系操作集合和关系完整性约束3部分组成。
(1)单一的数据结构——关系
关系模型的数据结构非常单一。在关系模型中,现实世界的实体以及实体间的各种联系均用关系来表示。在用户看来,关系模型中数据的逻辑结构是一张二维表。
(2)关系操作
关系模型给出了关系操作的能力,但不对RDBMS语言给出具体的语法要求。关系模型中常用的关系操作包括:选择(Select)、投影(Project)、连接(Join)、除(Divide)、并(Union)、交(Intersection)、差(Difference)等查询(Query)操作和增加(Insert)、删除(Delete)、修改(Update)操作两大部分。査询的表达能力是其中最主要的部分。
关系操作的特点是集合操作方式,即操作的对象和结果都是集合,这种操作方式也称为一次一集合(set-at-a-time)的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。
早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数和关系演算。关系代数是用对关系的运算来表达查询要求的方式。关系演算是用谓词来表达査询要求的方式。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。关系代数、元组关系演算和域关系演算3种语言在表达能力上是完全等价的。
关系代数、元组关系演算和域关系演算均是抽象的查询语言,这些抽象的语言与具体的DBMS中实现的实际语言并不完全一样。但它们能用做评估实际系统中査询语言能力的标准或基础。实际的查询语言除了提供关系代数或关系演算的功能外,还提供了许多附加功能,如集函数、关系赋值、算术运算等。
关系语言是一种高度非过程化的语言,用户不必请求DBA为其建立特殊的存取路径,存取路径的选择由DBMS的优化机制来完成,此外,用户不必求助于循环结构就可以完成数据操作。
另外,还有一种介于关系代数和关系演算之间的语言SQL(Structural Query Language),SQL不仅具有丰富的査询功能,而且具有数据定义和数据控制功能,是集查询、DDL、DML和DCL于一体的关系数据语言,它充分体现了关系数据语言的特点和优点,是关系数据库的标准语言。
这些关系数据语言的共同特点是,语言具有完备的表达能力,是非过程化的集合操作语言,功能强,能够嵌入高级语言中使用。
(3)关系的3类完整性约束
关系模型允许定义3类完整性约束,分别为实体完整性、参照完整性和用户定义的完整性。其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,应该由关系系统自动支持;用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
2.关系数据结构
在关系模型中,无论是实体还是实体之间的联系均由单一的结构类型即关系(表)来表示。前面已经非形式化地介绍了关系模型及有关的基本概念。关系模型是建立在集合代数的基础上的,这里从集合论角度给出关系数据结构的形式化定义。
·域:一组具有相同数据类型的值的集合。
·笛卡儿积:给定一组域D1,D2,…,Dn,这些域中可以有相同的。D1,D2,…,Dn的笛卡儿积为:
D1×D2×…×Dn={(d1,d2,…,dn)|dj∈Dj,j=1,2,…,n}
其中每一个元素(d1,d2,…,dn)叫做一个n元组(简称为元组)。元组中的每一个值dj叫做一个分量。
·关系:D1×D2×…×Dn的子集叫做在域D1、D2、…、Dn上的关系,表示如下。
R(D1,D2,…,Dn)
这里R表示关系的名字,n是关系的目或度。
关系中的每个元素是关系中的元组,通常用t表示。关系是笛卡儿积的子集,所以关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了加以区分,必须对每列起一个名字,称为属性。
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码(候选键)。若一个关系有多个候选码,则选定其中一个为主码(主键)。主码的诸属性称为主属性。不包含在任何候选码中的属性称为非码属性(非主属性)。在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称为全码。
关系可以有基本关系(通常又称为基本表或基表)、查询表和视图表3种类型。基本表是实际存在的表,它是实际存储数据的逻辑表示。查询表是查询结果对应的表。视图表是由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
基本关系具有以下6个性质。
·列是同质的,即每一列中的分量是同一类型的数据,来自同一个域。
·不同的列可出自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名。
·列的顺序无所谓,即列的次序可以任意交换。
·任意两个元组不能完全相同。但在大多数实际关系数据库产品中,例如Oracle等,如果用户没有定义有关的约束条件,它们都允许关系表中存在两个完全相同的元组。
·行的顺序无所谓,即行的次序可以任意交换。
·分量必须取原子值,即每一个分量都必须是不可分的数据项。
关系的描述称为关系模式。一个关系模式应当是一个5元组。它可以形式化地表示为:R(U,D,DOM,F)。其中R为关系名,U为组成该关系的属性名集合,D为属性组U中属性所来自的域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合。关系模式通常可以简记为:R(A1,A2,…,An)。其中R为关系名,A1,A2,…,An为属性名。
关系实际上就是关系模式在某一时刻的状态或内容。也就是说,关系模式是型,关系是它的值。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。但在实际当中,常常把关系模式和关系统称为关系,读者可以从上下文中加以区别。
在关系模型中,实体,以及实体间的联系都是用关系来表示的。在一个给定的现实世界领域中,相应于所有实体及实体之间的联系的关系的集合构成一个关系数据库。
关系数据库也有型和值之分。关系数据库的型也称为关系数据库模式,是对关系数据库的描述,是关系模式的集合。关系数据库的值也称为关系数据库,是关系的集合。关系数据库模式与关系数据库通常统称为关系数据库。
3.关系的完整性
关系完整性是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。完整性通常包括域完整性(Integrity Constrains),实体完整性(Entity Integrity)、参照完整性(Referential Integrity)和用户定义完整性(User Defined Integrity),其中域完整性,实体完整性和参照完整性,是关系模型必须满足的完整性约束条件。
(1)域完整性约束
域完整性是保证数据库字段取值的合理性。
属性值应是域中的值,这是关系模式规定了的。除此之外,一个属性能否为NULL,这是由语义决定的,也是域完整性约束的主要内容。域完整性约束是最简单、最基本的约束。在当今的关系DBMS中,一般都有域完整性约束检查功能。
包括主键(PRIMARYKEY)、检查(CHECK)、默认值(DEFAULT)、唯一(UNIQUE)、不为空(NOTNULL)及外键(FOREIGNKEY)等约束。
(2)实体完整性约束
实体完整性是指关系的主关键字不能重复也不能取“空值”。
一个关系对应现实世界中一个实体集。现实世界中的实体是可以相互区分、识别的,也即它们应具有某种唯一性标识。在关系模式中,以主关键字作为唯一性标识,而主关键字中的属性(称为主属性)不能取空值,否则,表明关系模式中存在着不可标识的实体(因空值是“不确定”的),这与现实世界的实际情况相矛盾,这样的实体就不是一个完整实体。按实体完整性规则要求,主属性不得取空值,如主关键字是多个属性的组合,则所有主属性均不得取空值。
(3)参照完整性约束
参照完整性是定义建立关系之间联系的主关键字与外部关键字引用的约束条件。
关系数据库中通常都包含多个存在相互联系的关系,关系与关系之间的联系是通过公共属性来实现的。所谓公共属性,它是一个关系R(称为被参照关系或目标关系)的主关键字,同时又是另一关系K(称为参照关系)的外部关键字。如果参照关系K中外部关键字的取值,要么与被参照关系R中某元组主关键字的值相同,要么取空值,那么,在这两个关系间建立关联的主关键字和外部关键字引用,符合参照完整性规则要求。如果参照关系K的外部关键字也是其主关键字,根据实体完整性要求,主关键字不得取空值,因此,参照关系K外部关键字的取值实际上只能取相应被参照关系R中已经存在的主关键字值。
在学生管理数据库中,如果将选课表作为参照关系,学生表作为被参照关系,以“学号”作为两个关系进行关联的属性,则“学号”是学生关系的主关键字,是选课关系的外部关键字。选课关系通过外部关键字“学号”参照学生关系。
(4)用户定义完整性约束
实体完整性和参照完整性适用于任何关系型数据库系统,它主要是针对关系的主关键字和外部关键字取值必须有效而做出的约束。用户定义完整性则是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验,用户定义完整性主要包括字段有效性约束和记录有效性。