3.1 关系数据模型的组成
关系数据库使用关系数据模型组织数据。这种思想源于数学,最早提出类似方法的是COD-ASYL(数据系统语言会议)于1962年发表的“信息代数”一文,之后,David Child于1968年在计算机上实现了集合论数据结构。
而真正系统、严格地提出关系数据模型的是IBM的研究员E.F.Codd,他于1970年在美国计算机学会会刊(《Communication of the ACM》)上发表了题为“A Relational Model of Data for Shared Data Banks”的论文,开创了数据库系统的新纪元。此后,他连续发表了多篇论文,奠定了关系数据库的理论基础。
关系数据模型由关系数据结构、关系操作集合和数据完整性约束三部分组成。
3.1.1 关系数据结构
关系数据模型源于数学,它用二维表来组织数据,而这个二维表在关系数据库中就称为关系。关系数据库就是表或者说是关系的集合。
关系系统要求让用户所感觉的数据就是一张张表,如2.3.3节所示的学生表和选课表。在关系系统中,表是逻辑结构而不是物理结构。实际上,系统在物理层可以使用任何有效的存储结构来存储数据,如有序文件、索引、散列表、指针等。因此,表是对物理存储数据的一种抽象表示——对很多存储细节的抽象,如存储记录的位置、记录的顺序、数据值的表示,以及记录的访问结构,如索引等,对用户来说都是不可见的。
3.1.2 关系操作
关系数据模型给出了关系操作的能力。关系数据模型中的操作包括:
传统的关系运算:并(Union)、交(Intersection)、差(Difference)、广义笛卡儿乘积(Extended Cartesian Product)。
专门的关系运算:选择(Select)、投影(Project)、连接(Join)、除(Divide)。
有关的数据操作:查询(Query)、插入(Insert)、删除(Delete)、修改(Update)。
关系模型的操作对象是集合,而不是单个的行,也就是操作的数据以及操作的结果都是完整的表(包括只包含一行数据的表,甚至不包含任何数据的空表)。而非关系型数据库系统中典型的操作是一次一行或一次一个记录。因此,集合处理能力是关系系统区别于其他系统的一个重要特征。
在非关系模型中,各个数据记录之间是通过指针等方式连接的,当要定位到某条记录时,需要用户自己按指针的链接方向逐层查找,我们称这种查找方式为用户“导航”。而在关系数据模型中,由于是按集合进行操作,因此,用户只需要指定数据的定位条件,数据库管理系统就可以自动定位到该数据记录,而不需要用户来导航。这也是关系数据模型在数据操作上与非关系模型的本质区别。
例如,若采用层次数据模型,对第2章图2-6所示的层次结构,若要查找“计算机学院软件工程教研室的张海涛老师的信息”,则首先需要从根节点的“学院”开始,根据“计算机”学院指向的“教研室”节点的指针,找到“教研室”层次,然后在“教研室”层次中逐个查找(这个查找过程也许是通过各节点间的指针实现的),直到找到“软件工程”节点,然后根据“软件工程”节点指向“教师”节点的指针,找到“教师”层次,最后在“教师”层次中逐个查找教师名为“张海涛”的节点,此时该节点包含的信息即所要查找的信息。这个过程的示意图如图3-1所示,其中的虚线表示沿指针的逐层查找过程。
而如果是在关系模型中查找信息,比如在表3-1所示的“学生”关系中查找“信息系学号为0521101的学生的详细信息”,则用户只需要提出这个要求即可,其余的工作就交给数据库管理系统来实现了。对用户来说,这显然比在层次模型中查找数据要简单得多。
关系模型的数据操作主要包括四种:查询、插入、删除和更改数据。关系数据库中的信息只有一种表示方式,就是表中的行列位置有明确的值。这种表示是关系系统中唯一可行的方式(当然,这里指的是逻辑层)。特别地,关系数据库中没有连接一个表到另一个表的指针。在表3-1和表3-2中,表3-1所示的学生表的第1行数据与表3-2所示的学生选课表中的第1行(当然也与第2、3、4行)有联系,因为0512101号学生选了课程。但在关系数据库中这种联系不是通过指针来实现的,而是通过学生表中“学号”列的值与学生选课表中“学号”列的值关联的(学号值相等)。但在非关系系统中,这些信息一般由指针来表示,这种指针对用户来说是可见的。因此,在非关系模型中,用户需要知道数据之间的指针链接关系。
需要注意的是,当我们说关系数据库中没有指针时,并不是指在物理层没有指针。实际上,在关系数据库的物理层也使用指针,但所有这些物理层的存储细节对用户来说都是不可见的,用户所看到的物理层实际上就是存放数据的数据库文件,他们能够看到的就是这些文件的文件名、存放位置等上层信息,而没有指针这样的底层信息。
关系操作是通过关系语言实现的,关系语言的特点是高度非过程化的。所谓非过程化是指:
用户不必关心数据的存取路径和存取过程,只需要提出数据请求,数据库管理系统就会自动完成用户请求的操作。
用户也没有必要编写程序代码来实现对数据的重复操作。
3.1.3 数据完整性约束
在数据库中,数据的完整性是指保证数据正确性的特征。数据完整性是一种语义概念,它包括两个方面:
1)与现实世界中应用需求的数据的相容性和正确性。
2)数据库内数据之间的相容性和正确性。
例如,学生的学号必须是唯一的,学生的性别只能是“男”和“女”,学生所选的课程必须是已经开设的课程等。因此,数据库是否具有数据完整性特征关系到数据库系统能否真实地反映现实世界的情况。数据完整性是数据库中非常重要的内容。
数据完整性由完整性规则定义,而关系模型的完整性规则是对关系的某种约束条件。在关系数据模型中一般将数据完整性分为三类,即实体完整性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束,是系统级的约束。用户定义的完整性主要是限制属性的取值范围,也称为域的完整性,这属于应用级的约束。数据库管理系统应该提供对这些数据完整性的支持。