2.2 常见的数据模型
数据库系统中最常使用的数据模型是层次模型、网状模型和关系模型,新兴的数据模型是面向对象数据模型和对象关系数据模型。本节较详细地介绍经常使用的3种数据模型的结构特点和完整性约束条件,分析对照它们的性能,指出其优缺点和使用场合。本节也介绍新兴数据模型的概念和方法。
2.2.1 数据模型概述
数据模型具有数据结构、数据操作和数据约束条件三要素。认识或描述一种数据模型也要从它的三要素开始。
1.数据模型的三要素
数据模型是一组严格定义的概念集合。这些概念精确地描述了系统的数据结构、数据操作和数据完整性约束条件。下面就介绍这些概念。
(1)数据结构
数据结构是所研究的对象类型(Object Type)的集合。这些对象是数据库的组成成分,它们包括两类:一类是与数据类型、内容和性质有关的对象,例如,层次模型或网状模型中的数据项和记录,关系模型中的关系和属性等;另一类是与数据之间联系有关的对象,例如,在网状模型中由于记录型之间的复杂联系,为了区分记录型之间不同的联系,对联系进行命名,命名的联系称之为系型(Set Type)。
在数据库系统中,通常按照数据结构的类型来命名数据模型,例如,层次结构、网状结构和关系结构的数据模型分别被命名为层次模型、网状模型和关系模型。
(2)数据操作
数据操作是指对数据库中各种数据对象允许执行的操作集合。数据操作包括操作对象和有关的操作规则两部分。数据库中的数据操作主要有数据检索和数据更新(即插入、删除或修改数据的操作)两大类操作。
数据模型必须对数据库中的全部数据操作进行定义,指明每项数据操作的确切含义、操作对象、操作符号、操作规则及对操作的语言约束等。数据操作是对系统动态特性的描述。
(3)数据约束条件
数据约束条件是一组数据完整性规则的集合。数据完整性规则是指数据模型中的数据及其联系所具有的制约和依存规则。数据约束条件用以限定符合数据模型的数据库状态及状态的变化,以保证数据库中数据的正确、有效和相容。
每种数据模型都规定有基本的完整性约束条件,这些完整性约束条件要求所属的数据模型都应满足。同理,每个数据模型还规定了特殊的完整性约束条件,以满足具体应用的要求。例如,在关系模型中,基本的完整性约束条件是实体完整性和参照完整性,特殊的完整性条件是用户定义的完整性。
2.常见的数据模型
当前,数据库领域最常用的数据模型主要有3种,它们是层次模型(Hierarchical Model)、网状模型(Network Model)和关系模型(Relational Model)。
层次模型和网状模型统称非关系模型。非关系模型的数据库系统在20世纪70年代至80年代初非常流行,在当时的数据库产品中占据了主导地位。关系模型的数据库系统在70年代开始出现,之后发展迅速,并逐步取代了非关系模型数据库系统的统治地位。现在流行的数据库系统大都是基于关系模型的。
在非关系模型中,实体集用记录表示,实体的属性对应记录的数据项(或字段)。实体集之间的联系转换成记录之间的两两联系。非关系模型中数据结构的单位是基本层次联系。所谓基本层次是指两个记录及它们之间的一对多(包括一对一)的联系,其结构和表示方法如图2-7所示。
在图2-7中,Ri位于联系Lij的始结点,称为双亲结点(Parent);Rj位于联系Lij的终结点,称为子女结点(Child)。
图2-7 基本层次联系
2.2.2 层次模型
层次模型是数据库系统中最早出现的数据模型,层次数据库系统采用层次模型作为数据的组织方式。层次数据库系统的典型代表是IBM公司的IMS(Information Management System)。层次模型用树形结构来表示各类实体及实体间的联系。
1.层次模型的数据结构
(1)层次模型的定义
在数据结构中,定义满足下面两个条件的基本层次联系的集合为层次模型。
1)有且仅有一个结点没有双亲结点,这个结点称为根结点。
2)除根结点之外的其他结点有且只有一个双亲结点。
(2)层次模型的数据表示方法
层次模型中的数据用下列方法表示。
在层次模型中,实体集使用记录表示;记录型包含若干个字段,字段用于描述实体的属性;记录值表示实体;记录之间的联系使用基本层次联系表示。层次模型中的每个记录可以定义一个排序字段,排序字段也称为码字段,其主要作用是确定记录的顺序。如果排序字段的值是唯一的,则它能唯一地标识一个记录值。
在层次模型中,使用结点表示记录。记录之间的联系用结点之间的连线表示,这种联系是父子之间的一对多的实体联系。层次模型中的同一双亲的子女结点称为兄弟结点(Twin或Sibling),没有子女结点的结点称为叶结点。图2-8给出了一个层次模型的例子,其中,R1为根结点,R2和R3都是R1的子女结点,R2和R3为兄弟结点;R4和R5是R3的子女结点,R4和R5也为兄弟结点;R2、R4和R5为叶结点。
图2-8 层次模型的一个示例
(3)层次模型的特点
层次模型像一棵倒立的树,只有一个根结点,有若干个叶结点,结点的双亲是唯一的。图2-9是一个教学院系的数据模型,该层次数据结构中有4个记录。
图2-9 教学院系的数据模型
在图2-9所示的模型中,院系记录是根结点,它有院系编号、院系名称和办公地点3个数据项,其两个子女结点是教研室和学生记录;教研室记录是院系的子女结点,它还是教师的双亲结点,教研室记录由教研室编号、教研室名两个数据项组成;学生记录由学号、姓名和年龄3个数据项组成;教师记录由职工号、姓名和专业方向3个数据项组成。学生与教师是叶结点,它们没有子女结点。在该层次数据结构中,院系与教研室、教研室与教师、院系与学生的联系均是一对多的联系。图2-10是教学院系数据模型对应的一个实例。
在图2-10中,根记录值为“D10,计算机系,9号楼”,它与教研室的“C01,硬件教研室”和“C02,软件教研室”有联系,同时,也与学生的“00001,王平,20”和“00002,李丽,20”有联系;这4个位于子女结点的记录值是它对应的上层结点记录值的属记录值,而它们对应的上层记录值是首记录值。硬件教研室有属记录值“92001,王海,电器”和“92002,张铮,自动化”,软件教研室有“92003,许明,数据库”和“92004,陈真,人工智能”。层次结构数据的一个实例由一个根记录值和它的全部属记录值组成,全部属记录值包括属记录、属记录的属记录……直到位于叶结点的属记录为止。
图2-10 教学院系数据模型对应的一个实例
层次模型具有一个基本特点:对于任何一个给定的记录值,只有按其路径查看,才能显示出它的全部意义,没有一个子女记录值能够脱离双亲记录值而独立存在。例如,对于图2-10中的学生记录值(00001,王平,20),如果不指出它的双亲结点,就不知道它是哪个院系的学生。
虽然理论上认为一个层次模型可以包含任意多的记录和字段数据,但任何实际的数据库系统都会因为存储容量或者实现复杂度的原因,对层次模型中包含的记录个数和字段个数进行限制。
2.层次模型中多对多联系的表示
前面提到,层次模型只能表示一对多(包括一对一)的联系,而不能直接地表示多对多的联系。当有多对多联系需要在层次模型中表示时,应采用分解的方法,即将多对多的联系分解成一对多的联系,使用多个一对多联系来表示一个多对多联系。分解方法主要有两种:冗余结点分解法和虚拟结点分解法。
图2-11是一个含有多对多联系的E-R图。图中有学生和课程两个实体集,它们之间的联系为多对多类型,即一个学生可以选修多门课程,一门课程可由多个学生选修。下面用这个例子说明多对多联系的分解方法。
图2-11 一个多对多联系的例子
(1)冗余结点分解法
冗余结点分解法是通过增加冗余结点的方法将多对多的联系转换成一对多的联系。对于图2-11所示的多对多联系的实例,要设计两组学生和课程记录:一组表示一个学生选择多门课程的学生与课程之间的1∶n联系;另一组表示一门课程有多个学生选择的课程与学生之间的1∶n联系,其基本层次联系如图2-12所示。显然,使用冗余结点分解法会使数据库中有冗余的学生和课程记录。
图2-12 用冗余结点分解法表示多对多联系
(2)虚拟结点分解法
所谓虚拟结点就是一个指引元,该指引元指向所代替的结点。虚拟结点分解法通过使用虚拟结点,将实体集间的多对多联系分解为多个层次模型,然后用多个层次模型表示一对多联系。将图2-12中的冗余结点转换为虚拟结点,可得到具有虚拟结点的基本层次联系,如图2-13所示。
图2-13 用虚拟结点分解法表示多对多联系
上面两种方法各有所长。冗余结点分解法的优点是结构清晰,允许结点改变存储位置;缺点是占用存储空间大,有潜在的不一致性。虚拟结点分解法的优点是占用存储空间小,能够避免潜在的不一致性问题;缺点是结点改变存储位置时可能引起虚拟结点指针的改变。
3.层次模型的数据操作和完整性约束条件
层次模型的数据操作主要是数据的查询、插入、删除和修改。层次模型必须满足的完整性约束条件如下。
1)在进行插入记录值操作时,如果没有指明相应的双亲记录值(首记录值),则不能插入子女记录值(属记录值)。
例如,在图2-9的层次数据库中,若转学来一个学生,但还没有为该学生指明院系,则不能将该学生记录插入到数据库中。
2)进行删除记录操作时,如果删除双亲记录值(首记录值),则相应的子女结点值(属记录值)也同时被删除。
例如,在图2-9的层次数据库中,若删除软件教研室,则该教研室的教师数据将全部丢失;若删除计算机系,则计算机系所有的学生和教研室将全部被删除,相应的所有教师也将被全部删除。
3)进行修改记录操作时,应修改所有相应记录,以保证数据的一致性。
例如,在图2-12的层次模型中,若修改一个学生的年龄,则两处学生记录值的年龄字段都要执行修改操作。同样,要增加一个学生记录值时,也要同时对两处的学生记录执行插入操作,结果不仅造成操作麻烦,还特别容易引起数据不一致的问题。
4.层次模型的存储结构
在层次数据库中,不但要存储数据,而且还要存储数据之间的层次联系。层次模型数据的存储一般使用邻接存储法和链接存储法实现。
(1)邻接存储法
邻接存储法是按照层次树前序遍历的顺序,把所有记录值依次邻接存放,即通过物理空间的位置相邻来安排(或隐含)层次顺序,实现存储。
例如,对于图2-14a所示的数据模型,它的一个实例如图2-14b所示。
图2-14 层次数据库及其实例
图2-15为图2-14所示实例按邻接存储法存放的实例。
图2-15 邻接存储法存放的实例
(2)链接存储法
链接存储法是用指引元来反映数据之间的层次联系,它主要有子女-兄弟链接法和层次序列链接法两种方法。
1)子女-兄弟链接法。子女-兄弟链接法要求每个记录设两个指引元,一个指引元指向它的最左边的子女记录值(属记录值),另一个指引元指向它的最近兄弟记录。图2-14b所示的实例,如果用子女-兄弟链接法表示,其结构如图2-16所示。
图2-16 子女-兄弟链接法
2)层次序列链接法。层次序列链接法按树的前序穿越顺序,链接各记录值。图2-14b所示的实例,如果用层次序列链接法表示,其结构如图2-17所示。
图2-17 层次序列链接法
2.2.3 网状模型
在现实世界中,许多事物之间的联系是非层次结构的,它们需要使用网状模型表示。网状数据库系统是采用网状模型作为数据组织方式的数据库系统。网状数据库系统的典型代表是DBTG系统,也称CODASYL系统。它是20世纪70年代数据系统语言研究会CODASYL(Conference On Data System Language)下属的数据库任务组(Data Base Task Group,DBTG)提出的一个系统方案。DBTG系统虽然不是实际的数据库软件系统,但是它提出的基本概念、方法和技术,对网状数据库系统的研制和发展产生了重大的影响,后来不少的数据库系统都采用了DBTG模型。例如,HP公司的IMAGE、Univac公司的DMS1100、Honeywell公司的IDS/2和Cullinet Software公司的IDMS等。
1.网状模型的数据结构
(1)网状模型结构的基本特征
满足以下两个条件的基本层次联系的集合称为网状模型。
1)有一个以上的结点没有双亲。
2)结点可以有多于一个的双亲。
图2-18分别为网状模型的3个例子。
图2-18 网状模型的例子
网状模型的结构比层次模型的结构更具有普遍性,它允许多个结点没有双亲,也允许结点有多于一个的双亲。此外,网状模型还允许两个结点之间有多种联系。因而,网状模型可以更直接地去描述现实世界。
(2)网状模型的数据表示方法
1)同层次模型一样,网状模型也使用记录和记录值表示实体集和实体;每个结点也表示一个记录,每个记录可包含若干个字段。
2)网状模型中的联系用结点间的有向线段表示。每个有向线段表示一个记录间的一对多的联系。网状模型中的联系简称为系。由于网状模型中的系比较复杂,两个记录之间可以存在多种系。一个记录允许有多个双亲记录,所以网状模型中的系必须命名。用系名标识不同的系。例如,图2-18a中R3有两个双亲记录R1和R2,因此把R1与R3之间的联系命名为L1,R2与R3之间的联系命名为L2。另外,网状模型中允许有复合链,即两个记录间可以有两种以上的联系,如图2-18b所示。
层次模型实际上是网状模型的一个特例。
2.网状模型的完整性约束条件
网状模型记录间的联系比较复杂。一般来说,它没有层次模型那样严格的完整性约束条件,但具体的网状数据库系统对数据操纵都加了一些限制,提供了一定的完整性约束。例如,DBTG在模式DDL中,提供了定义DBTG数据库完整性的若干个概念和语句,分别如下。
1)支持记录码的概念。码即唯一标识记录的数据项的集合。
2)保证一个联系中双亲记录和子女记录之间是一对多的联系。
3)可以支持双亲记录和子女记录之间某些约束条件。例如,有些子女记录要求双亲记录存在时才能插入,双亲记录删除时也连同删除。
3.网状模型的存储结构
由于网状模型记录之间的联系比较复杂,因而如何实现记录之间联系的问题是网状模型存储结构中的关键。网状模型常用的存储方法是链接法,它包括单向链接、双向链接、环状链接和向首链接等。此外,网状数据模型还用其他的存储方法,如指引元阵列法、二进制阵列法和索引法等。
4.网状模型和层次模型比较
网状模型和层次模型比较,双方各有其自身的优缺点。
(1)层次模型的主要优缺点
层次模型的主要优点有:数据模型本身比较简单;系统性能优于关系模型和网状模型;能够提供良好的完整性支持。
层次模型的主要缺点有:在表示非层次性的联系时,只能通过冗余数据(易产生不一致性)或创建非自然的数据组织(引入虚拟结点)来解决;对插入和删除操作的限制比较多;查询子女结点必须通过双亲结点;由于结构严密,层次命令趋于程序化。
(2)网状模型的主要优缺点
网状模型的主要优点有:能够更直接地描述现实世界,一个结点可以有多个双亲,允许复合链,具有良好的性能,存取效率比较高。
网状模型的缺点主要有:结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于用户掌握;DDL和DML语言复杂,用户不容易使用;由于记录之间的联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径,因此,用户必须了解系统结构的细节后才能实现其数据存取,程序员要为访问数据设置存取路径,加重了编写应用程序的负担。
2.2.4 关系模型
关系模型是3种模型中最重要的一种。关系数据库系统采用关系模型作为数据的组织方式,现在流行的数据库系统大都是关系数据库系统。关系模型是由美国IBM公司San Jose研究室的研究员E.F.Codd于1970年首次提出的。自20世纪80年代以来,计算机厂商新推出的数据库管理系统几乎都是支持关系模型的,非关系模型的产品也大都加上了关系接口。
1.关系模型的数据结构
关系模型建立在严格的数学概念的基础上。在关系模型中,数据的逻辑结构是一张二维表,它由行和列组成。
(1)关系模型中的主要术语
1)关系:一个关系(Relation)对应通常所说的一张二维表。表2-2就是一个关系。
表2-2 学生学籍表
2)元组:表中的一行称为一个元组(Tuple),许多系统中把元组称为记录。
3)属性:表中的一列称为一个属性(Attribute)。一个表中往往会有多个属性,为了区分属性,要给每一个列起一个属性名。同一个表中的属性应具有不同的属性名。
4)码:表中的某个属性或属性组,它们的值可以唯一地确定一个元组,且属性组中不含多余的属性,这样的属性或属性组称为关系的码(Key)。
例如,在表2-2中,学号可以唯一地确定一个学生,因而学号是学生学籍表的码。
5)域:属性的取值范围称为域(Domain)。例如,大学生年龄属性的域是(16~35),性别的域是(男,女)。
6)分量:元组中的一个属性值称为分量(Element)。
7)关系模式:关系的型称为关系模式(Relation Schema),关系模式是对关系的描述。关系模式一般的表示是:关系名(属性1,属性2,…,属性n)。
例如,学生学籍表关系可描述为:学生学籍(学号,姓名,性别,年龄,所在系)。
(2)关系模型中的数据全部用关系表示
在关系模型中,实体集及实体间的联系都是用关系来表示的。
例如,关系模型中,学生、课程、学生与课程之间的联系可表示为:
关系模型要求关系必须是规范化的。所谓关系规范化是指关系模式要满足一定的规范条件。关系的规范条件很多,但首要条件是关系的每一个分量必须是不可分的数据项。
2.关系操作和关系的完整性约束条件
关系操作主要包括数据查询、插入、删除和修改。关系中的数据操作是集合操作,无论操作的原始数据、中间数据或结果数据都是若干元组的集合,而不是单记录的操作方式。此外,关系操作语言都是高度非过程的语言,用户在操作时,只要指出“干什么”或“找什么”,而不必详细说明“怎么干”或“怎么找”。由于关系模型把存取路径向用户隐蔽起来,使得数据的独立性大大地提高了;由于关系语言的高度非过程化,使得用户对关系的操作变得容易,提高了系统的效率。
关系的完整性约束条件包括实体完整性、参照完整性和用户定义的完整性。
3.关系模型的存储结构
在关系数据库的物理组织中,关系以文件形式存储。一些小型的关系数据库管理系统(RDBMS)采用直接利用操作系统文件的方式实现关系存储,一个关系对应一个数据文件。为了提高系统性能,许多关系数据库管理系统采用自己设计的文件结构、文件格式和数据存取机制进行关系存储,以保证数据的物理独立性和逻辑独立性,更有效地保证数据的安全性和完整性。
4.关系模型与非关系模型比较
与非关系模型相比,关系模型具有下列特点。
(1)关系模型建立在严格的数学基础之上
关系及其系统的设计和优化有数学理论指导,因而容易实现且性能好。
(2)关系模型的概念单一,容易理解
关系数据库中,无论实体还是联系,无论是操作的原始数据、中间数据还是结果数据,都用关系表示。这种概念单一的数据结构,使数据操作方法统一,也使用户易懂易用。
(3)关系模型的存取路径对用户隐蔽
用户根据数据的逻辑模式和子模式进行数据操作,而不必关心数据的物理模式情况,无论计算机专业人员还是非计算机专业人员使用起来都很方便,数据的独立性和安全保密性都较好。
(4)关系模型中的数据联系是靠数据冗余实现的
关系数据库中不可能完全消除数据冗余。由于数据冗余,使得关系的空间效率和时间效率都较低。
基于关系模型的优点,关系数据模型自诞生以后发展迅速,深受用户的喜爱;而计算机硬件的飞速发展,更大容量、更高速度的计算机会对关系模型的缺点给予一定的补偿。因而,关系数据库始终保持其主流数据库的地位。
2.2.5 面向对象数据模型
面向对象数据库系统支持面向对象数据模型(简称OO模型)。一个面向对象的数据库系统是一个持久的、可共享的对象库的存储和管理者;而一个对象库是由一个面向对象数据模型所定义的对象集合体。
1.面向对象数据模型的基本概念
一个面向对象数据模型是用面向对象观点来描述现实世界实体(对象)的逻辑组织、对象间限制、联系的模型。一系列面向对象核心概念构成了面向对象数据模型的基础。面向对象数据模型的核心概念如下。
(1)对象与对象标识
现实世界的任一实体都被统一地模型化为一个对象(Object),每一个对象有一个唯一的标识,称为对象标识OID(Object Identifier)。对象是现实世界中实体的模型化,它与记录、元组相似,但远比它们复杂。
(2)封装
每一个对象是其状态与行为的封装(Encapsulation),其中状态是该对象一系列属性值的集合,而行为是在对象状态上操作方法的集合。
(3)类
共享同一属性结合和方法集合的所有对象组合在一起构成了一个对象类(Class,简称类),一个对象是某一类的一个实例(instance)。例如,学生是一个类,具体某一个学生,如王英是学生类中的一个对象。在数据库系统中有“型”和“值”的概念,而在OODB中,“型”就是类,对象是某一类的“值”。类属性的定义域可以为基本类,如字符串、整数和布尔型,也可以为一般类,即包含属性和方法的类。一个类的属性也可以定义为这个类自身。
(4)类层次
一个系统中所有类组成的一个有根的有向无环图称为类层次(Class hierarchy)。如同面向对象程序设计一样,在面向对象数据模型中,可以定义一个类(如C1)的子类(C2),类C1称为类C2的父类(或超类)。子类还可以再定义子类,例如,C2可以再定义子类C3。这样面向对象数据模式的一组类就形成一个有限的层次结构,这就是类层次。一个类可以有多个超类,有的是直接的,有的是间接的。例如,C2是C3的直接超类,C1是C3的间接超类。一个类可以继承它的所有超类(包括直接超类和间接超类)的属性和方法。
(5)消息
在面向对象数据库中,对象是封装的。对象之间的通信是通过消息(Message)传递来实现的。即消息从外部传递给对象,存取和调用对象中的属性和方法,在内部执行要求的操作,操作的结果仍以消息的形式返回。
2.对象结构与对象标识
(1)对象结构
对象是由一组数据结构和在这组数据结构上的操作程序代码封装起来的基本单位。对象之间的界面由一组消息构成。一个对象通常包括以下几个部分。
1)属性集合。
所有属性构成了对象数据的数据结构。属性描述对象的状态、组成和特性。对象的某一属性可以是单值或多值的,也可以是一个对象。如果对象的某一属性还是对象,对象就形成了嵌套,这种嵌套可以继续,从而组成各种复杂对象。
2)方法集合。
方法用于描述对象的行为特性。方法的定义包括方法的接口和方法的实现两部分:方法的接口用以说明方法的名称、参数和结果返回值的类型,也称之为调用说明;方法的实现是一段程序代码,用以实现方法的功能,即对象操作的算法。
3)消息集合。
消息是对象向外提供的界面,消息由对象接收并响应。消息是指对象之间操作请求的传递,它并不管对象内部是如何处理的。
(2)对象标识
面向对象数据库中的每个对象都有一个唯一的、不变的标识,即对象标识(OID)。对象通常与实际领域的实体对应,在现实世界中,实体中的属性值可能随着时间的推移会发生改变,但是每个实体的标识始终保持不变。相应的,对象的部分(或全部)属性、对象的方法会随着时间的推移发生变化,但对象标识不会改变。两个对象即使属性值和方法都完全相同,但如果它们的对象标识不同,则认为两个对象不同,只是它们的值相同而已。对象标识的概念比程序设计语言或传统数据模型中所用到的标识概念更强。
下面是常用的几种对象标识。
1)值标识。
值标识是用值来表示的。关系数据库中使用的就是值标识,在关系数据库中,码值是一个关系的元组唯一标识。例如,学号“980001”唯一标识了计算机系的学生张三。
2)名标识。
名标识是用一个名字来表示标识。例如,程序变量使用的就是名标识,程序中的每个变量被赋予一个名字,变量名唯一地标识每个变量。
3)内标识。
上面两种标识是由用户建立的,内标识是建立在数据模型或程序设计语言中,不要求用户给出标识。面向对象数据库系统使用的就是内标识。
不同标识其持久性程度是不同的。若标识只能在程序或查询的执行期间保持不变,则称该标识具有程序内持久性。例如,程序设计语言中的变量名和SQL语句的元组标识符,就是具有程序内持久性的标识。若标识在从一个程序的执行到另一个程序的执行期间能保持不变,则称该标识具有程序间持久性。例如,在SQL语言中的关系名是具有程序间持久性的标识。若表示不仅在程序执行过程中而且在数据的重组重构过程中一直保持不变,则称该标识具有永久持久性。例如,面向对象数据库系统中对象标识具有永久持久性,而SQL语言中的关系名不具有永久持久性,因为数据的重构可能修改关系名。
对象表示具有永久持久性的含义是,一个对象一经产生,系统就给它赋予一个在全系统中唯一的对象标识符,直到它被删除。对象标识是由系统统一分配的,用户不能对对象标识符进行修改。对象标识是稳定的,它不会因为对象中某个值的修改而改变。
面向对象的数据库系统在逻辑上和物理上从面向记录(或元组)上升为面向对象、面向可具有复杂结构的一个逻辑整体。它允许用自然的方法并结合数据抽象机制在结构和行为上对复杂对象建立模型,从而大幅度提高管理效率,降低用户使用复杂度,并为版本管理、动态模式修改等功能的实现创造了条件。
3.封装
封装是面向对象数据模型的一个非常关键的概念。每一个对象是其状态与行为的封装。对象的通信只能通过消息,这是OO模型的主要特征之一。
(1)封装可以提高数据的独立性
由于对象的实现与对象应用相互隔离,这样当对操作的实现算法和数据结构进行修改时就不会影响接口,因而也就不必修改使用它们的应用。由于封装,对用户而言对象的实现是不可见的,这就隐蔽了在实现中使用的数据结构与程序代码等细节。
(2)封装可以提高应用程序的可靠性
由于对象封装后成为一个自含的单元,对象只接受已定义好的操作,其他程序不能直接访问对象中的属性,从而提高了程序的可靠性。
(3)封装会影响到数据查询功能
对象封装后也带来了另一个问题,即如果用户要查询某个对象的属性值,就必须通过调用方法,而不能像关系数据库系统那样进行即席的(随机的)、按内容的查询,这就不够方便灵活,失去了关系数据库的重要优点,因此在面向对象数据库中必须在对象封装方面做必要的修改或妥协。
4.类的概念
在面向对象数据库中,相似对象的集合称为类。类的一个实例称为一个对象。一个类所有对象的定义是相同的,不同对象的区别在于属性的取值不同。类和关系模式非常相似,类的属性类似关系模式的属性,对象类似元组。实际上,类本身也可以看作是一个对象,称为类对象(Class Object)。面向对象数据模式是类的集合。
面向对象数据模式中存在着多种相似但有所不同的类。例如,构造一个有关学校应用的面向对象数据库,教工和学生是其中的两个类。这两个类有一些属性是相同的,如两者都有身份证号、姓名、年龄、性别和住址等属性,也有一些相同的方法。当然,两者也有自己特殊的属性,如学生有学号、专业和年级等属性,而教工有工龄、工资、单位和电话号码等属性,有自己独特的方法。用户希望统一定义教员和学生的公共属性、方法和消息部分,分别定义各自的特殊属性、方法和消息部分。面向对象的数据模型提供的类层次结构可以实现上述要求。
5.类的层次结构
在面向对象数据模式中,一组类可形成一个类层次。一个面向对象数据模式可能有多个层次。在一个类层次中,一个类继承它的所有超类的全部属性、方法和消息。
例如,教工和学生可以分别定义成教工类和学生类,而教工类和学生类又都属于人这个类;教工又可定义教师、行政人员两个子类,学生类又可以定义本科生和研究生两个子类。图2-19表示了学校数据库的类层次关系。
需要指出的是,一个类可以从一个或多个已有的类中导出。
图2-19 学校数据库的类层次结构图
6.类的继承性
继承(Inherit)是面向对象数据库的重要特征。如果一个子类只能继承一个超类的特性(包括属性、方法和消息),这种继承称为单继承;如果一个子类能继承多个超类的特性,这种继承称为多重继承。单继承是因为子类是从一个类导出的,它只能继承这个类的特性;而多重继承是因为一个子类是从多个类导出的,它可以继承这多个类的所有特性。例如,本科生是从学生这个类导出的,因而它只继承了学生的所有特性,是单继承。在学校中还有在职研究生,他们既是教工又是学生,所以在职研究生既继承了教工的特性又继承了学生的特性,它具有多重继承性。
继承性有以下两个优点。
1)继承性是建模的有力工具,提供了对现实世界简明而精确的描述。
2)继承性提供了信息重用机制。
由于子类可以继承超类的特性,因此可以避免许多重复定义。当然子类还可以定义自己的属性、方法和消息。子类对父类既有继承又有发展,继承的部分就是重用的部分。
7.滞后联编
子类可以定义自己特殊的属性、方法和消息,但是当子类定义的方法与父类中的方法相同时,即发生同名冲突时,应用程序中的同名操作该执行哪种操作呢?究竟是执行父类中的操作还是子类中的操作呢?面向对象的数据库管理系统采用滞后联编(Late Binding)技术来解决这种冲突。具体方法为:系统不是在编译时就把操作名联编到程序上,而是在运行时根据实际请求中的对象类型和操作来选择相应的程序,把操作名与它联编上(即把操作名转换成该程序的地址)。
假设在前面的学校数据库系统中,在学生类中定义了一个操作“打印”,主要功能是打印学生的基本信息。而在研究生子类中,也定义了一个操作“打印”,这个操作不但打印学生的基本信息,还需要打印研究成果等研究生特有的信息。这样,在父类(学生)和子类(研究生)中都有一个“打印”操作,但是实际上这两个操作是不同的。在面向对象的数据库管理系统中,采用滞后联编的方法来解决操作名相同而内容不同的问题,即在编译时并不把“打印”操作联编到应用程序上,而是在应用程序执行时根据实际的对象类型和操作选择相应的程序。如果对象是学生就选择学生类的打印方法类执行,如果对象是研究生就选择研究生类的打印方法来执行。
8.对象的嵌套
在面向对象数据模式中,对象的属性不但可以是单值的或值的集合,还可以是一个对象。由于对象的属性也是一个对象,这样就形成了一种嵌套的层次结构。
图2-20所示的是一个对象嵌套实例。图中,工作单位的个人档案包括姓名、性别、出生日期、籍贯、政治面貌和主要社会关系等属性。这些属性中,姓名和籍贯的数据类型是字符串;性别的数据类型是逻辑型的;出生日期是日期型的;而社会关系则是一个对象,包括父亲、母亲和配偶等属性;而父亲、母亲和配偶等属性又是对象,它们的属性又包括姓名、年龄、工作单位和政治面貌等。
图2-20 个人档案的嵌套层次图
对象嵌套形成的层次结构和类层次结构形成了横向和纵向的复杂结构。不仅各种类之间具有层次结构,而且一个类内部也具有嵌套层次结构,这种结构不同于关系模式的平面结构,而是更能准确地反映现实世界的各种事物。
2.2.6 对象关系数据模型
对象关系数据模型是关系模型的扩展,是面向对象数据模型与关系模型结合的产物。对象关系数据模型是一种新型的数据模型,目前许多数据库管理系统都支持它。
1.对象关系数据模型的概念
对象关系数据模型使用二维表表示数据,它包括关系表和对象表两种。关系表属于关系模型,关系的属性对应于表的列,关系的元组对应于表的行,关系模型不支持方法。对象表属于面向对象数据模型,支持面向对象的基本功能,对象的类抽象对应二维表,类的实例(对象)对应于表中的行,类的属性对应于表的列,通过对象可调用方法。
对象表不再强调表结构一定要满足关系范式,取消了许多应用限制,扩展了关系模型的数据类型,增加了用户自定义的数据类型,更加灵活方便。
2.对象表的数据类型和表结构特点
对象表通过用户自定义数据类型,支持数据使用记录类型(对象类型)、数组类型和嵌入表类型,其表结构和设计方法与关系表有较大的变化。
(1)对象表的属性支持复合数据类型
关系表强调属性数据只能是不可分割的简单数据项,复合数据是不允许出现的。对象表的数据可以是基本项,也可以是组合数据项。
例如,要表示学生信息,属性有“姓名”“学号”“年龄”“班级”和“家庭住址”,还有“隶属关系、姓名、单位、联系电话”等家庭情况信息。用关系表示学生信息时,需要将家庭信息拆成一个个单一的基本项,与其他属性并列表示;如果改用对象表存储学生信息,可以将家庭信息定义成一个记录类型(对象类型),保持了原有属性的内在关系。
表2-3中,分别列出了使用对象表和关系表表示学生信息时的表结构,很容易看出含记录类型的对象表的结构特点。
表2-3 使用对象表和关系表表示学生信息时的表结构 学生信息的关系表结构
学生信息的对象表结构
(2)对象表的属性支持可变长数组类型
关系表的属性不支持数组类型,更不支持可变长的数组类型。在数据库设计时,对于一些数据个数不确定的信息,关系表只能使用独立新建表的方法来解决,这不仅破坏了数据的整体性,还增加了数据查询和处理的难度。由于对象表增加了数组类型,用户可以使用可变长的数组类型保存记录中数据个数不一样的属性数据,用更自然、更符合客观情况的方式存储数据,易于理解、处理和应用。
例如,要存储学生-选课信息,包括“学号”“姓名”“班级”“年龄”“选课名”及“成绩”项,由于每个学生实际选课的门数不一样,不能用固定的空间表示。使用关系表存储学生-选课信息时,数据库中需要学生表和选课表两个二维表,它们之间需要通过外码连接。如果改用对象表存储学生-选课信息,可以使用二维变长数组类型表示“选课名”及“成绩”,一个二维表就能满足使用要求。
表2-4中,列出了学生-选课信息使用变长数组类型的对象表结构,同时也列出了关系表的结构,供大家对照分析。
表2-4 学生-选课的对象表与关系表结构 学生-选课的关系表
学生-选课的对象表
(3)对象表的属性支持嵌入表数据类型
对象表中的属性,不仅可以是复合数据、数组数据等带结构的数据,还可以是嵌套表,信息结构更复杂、更丰富。嵌套表有行和列,表的长短与具体元组有关。例如,学生-选课表中的选课数据也可以采用嵌套表数据类型表示,如图2-21所示。
图2-21 学生-选课的对象表中有嵌入表的图例