数据库原理、应用与开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 逻辑模型

选定数据库应用系统软件之后,就需要将概念模型按照数据库应用软件的特点转换成逻辑模型。逻辑模型主要有层次数据模型、网状数据模型、关系数据模型和对象数据模型4种。逻辑模型的特点如下:①逻辑模型表达了数据库的整体逻辑结构;②逻辑模型是从数据库实现的观点出发对数据建模;③逻辑模型独立于硬件,但依赖于软件;④逻辑模型是数据库设计人员与应用程序员之间交流的工具。

2.2.1 层次数据模型

层次型DBMS是紧随网络型数据库而出现的。最著名、最典型的层次数据库系统是IBM公司在1968年开发的IMS(Information Management System),一种适合其主机的层次数据库。这是IBM公司研制的、最早的大型数据库系统程序产品。从20世纪60年代末起,如今已经发展到IMSV6,提供群集、N路数据共享、消息队列共享等先进特性的支持。这个具有50年历史的数据库产品在如今的WWW应用连接、商务智能应用中扮演着新的角色。

层次模型用树状结构表示实体类型与实体间的联系,实质上是一种有根结点的定向有序树(在数学中“树”被定义为一个无回路的连通图)。树根与枝点之间的联系称为边,树根与边之比为1∶M,即树根只有1个,树枝有M个。按照层次模型建立的数据库系统称为层次模型数据库系统。层次模型的表示方法是:树的结点表示实体集(记录的型),结点之间的连线表示相连两实体集之间的关系;通常把表示1的实体集放在上方,称为父结点,表示M的实体集放在下方,称为子结点。层次模型的结构特点是:①有且仅有一个根结点;②根结点以外的其他结点有且仅有一个父结点,但可以有任意子结点;③无子女的结点称为叶结点。

层次模型只能表示1-M关系,而不能直接表示M-M关系。在层次模型中,一个结点称为一个记录型,用来描述实体集。每个记录型可以有一个或多个记录值,上层一个记录值对应下层一个或多个记录值,而下层每个记录值只能对应上层一个记录值。层次模型如图2-4所示,数据如图2-5所示,在XML文件中数据就是以层次的结构存储的。

层次模型中对实体集多对多的联系的处理,解决方法是引入冗余结点。例如,学生和课程之间的多对多的联系,引入学生和课程的冗余结点,如图2-6所示,转换为两棵树:一棵树的根是学生,子结点是课程,它表现了一个学生可以选多门课程,如图2-7所示;另一棵树的根是课程,子结点是学生,它反映了一门课程可以被多个学生选,如图2-8所示。冗余结点可以用虚拟结点实现:在冗余结点处存放一个指向实际结点的指针。例如图2-7中的课程号结点,以及图2-8中的学号结点。

图2-4 通讯录的层次模型

图2-5 通讯录的数据

图2-6 层次模型的冗余结点法

图2-7 学生-课程

图2-8 课程-学生

层次模型的树是有序树(层次顺序)。对任一结点的所有子树都规定了先后次序,这一限制隐含了对数据库存取路径的控制。树中父子结点之间只存在一种联系,对树中的任一结点,只有一条自根结点到达它的路径,因此,不能直接表示多对多的联系。树结点中任何记录的属性只能是不可再分的简单数据类型。

层次模型的优点是:首先,层次数据模型本身比较简单;其次,层次模型中父子实体间联系是固定的,且预先定义好的应用系统,采用层次模型来实现,其性能优于关系模型,不低于网状模型;最后,层次数据模型提供了良好的完整性支持。

层次模型的缺点主要是:首先,现实世界中很多联系是非层次性的,如多对多联系、一个结点具有多个双亲等,层次模型表示这类联系的方法很笨拙,只能通过引入冗余数据(易产生不一致性)或创建非自然的数据组织(引入虚拟结点)来解决;其次,层次模型对插入和删除操作的限制比较多,查询子结点必须通过父结点;最后,层次模型的结构严密,层次命令趋于程序化,应用程序的编写较为复杂。

2.2.2 网状数据模型

最早出现的是网状DBMS,是美国通用电气公司Bachman等在1961年开发成功的IDS(Integrated Data Store)。1961年通用电气公司(General Electric Co.)的Charles Bachman成功地开发出世界上第一个网状DBMS也是第一个数据库管理系统——集成数据存储(Integrated Data Store IDS),奠定了网状数据库的基础,并在当时得到了广泛的发行和应用。IDS具有数据模式和日志的特征,但它只能在GE主机上运行,并且数据库只有一个文件,数据库中所有的表必须通过手工编码来生成。之后,通用电气公司一个客户BF Goodrich Chemical公司最终不得不重写了整个系统,并将重写后的系统命名为集成数据管理系统(IDMS)。网状数据库模型对于层次和非层次结构的事物都能比较自然地模拟,在关系数据库出现之前网状DBMS要比层次DBMS用得普遍。在数据库发展史上,网状数据库占有重要地位。1973年,Cullinane公司(也就是后来的Cullinet软件公司),开始出售Goodrich公司的IDMS改进版本,并且逐渐成为当时世界上最大的软件公司。

网状数据模型用有向图表示实体类型及实体之间的联系。有向图是一种比层次模型更具普遍性的结构,它去掉了层次模型的两个限制:①允许多个结点没有双亲结点;②允许结点有多个父结点,此外它还允许两个结点之间有多种联系(称为复合联系)。结点表示实体,边表示实体之间的联系。

在网状数据模型中,虽然每个结点可以有多个父结点,但是每个父记录和子记录之间的联系只能是1∶N的联系。因此,在网状数据模型中,对于M∶N的联系,必须人为地增加记录类型,把M∶N的联系分解为多个1∶N的二元联系。例如,学生和课程之间的多对多的联系,如图2-9所示。

图2-9 学生-课程的网状模型

网状模型的优点在于可以表示丰富的关系(包括多对多的关系),性能良好,存取效率高等。但是它也存在致命的弱点:结构复杂,其数据定义语言数据操作语言较为复杂,用户掌握使用较为困难,编程复杂等。

2.2.3 关系数据模型

网状数据库和层次数据库已经很好地解决了数据的集中和共享问题,但在数据独立性和抽象级别上仍有很大欠缺。用户在对这两种数据库进行存取时,仍然需要明确数据的存储结构,指出存取路径,而后来出现的关系数据库较好地解决了这些问题。

1.发展历程

1970年,IBM的研究员E.F.Codd博士在刊物“Communication of the ACM”上发表了一篇名为“A Relational Model of Data for Large Shared Data Banks”的论文,提出了关系模型的概念,奠定了关系模型的理论基础。尽管之前在1968年Childs已经提出了面向集合的模型,然而这篇论文仍然被普遍认为是数据库系统历史上具有划时代意义的里程碑。Codd的心愿是为数据库建立一个优美的数据模型。后来Codd又陆续发表多篇文章,论述了范式理论和衡量关系系统的12条标准,用数学理论奠定了关系数据库的基础。关系模型有严格的数学基础,抽象级别比较高,而且简单清晰,便于理解和使用。但是当时也有人认为关系模型是理想化的数据模型,用来实现DBMS是不现实的,尤其担心关系数据库的性能难以被接受,更有人视其为对当时正在进行中的网状数据库规范化工作的严重威胁。为了促进对问题的理解,1974年ACM牵头组织了一次研讨会,会上开展了一场分别以Codd和Bachman为首的支持和反对关系数据库两派之间的辩论。这次著名的辩论推动了关系数据库的发展,使其最终成为现代数据库产品的主流。

1970年,关系模型建立之后,IBM公司在San Jose实验室增加了更多研究人员研究这个项目,这个项目就是著名的System R。其目标是论证一个全功能关系DBMS的可行性。该项目结束于1979年,完成了第一个实现SQL的DBMS。然而,IBM对IMS的承诺阻止了System R的投产,一直到1980年System R才作为产品正式推向市场。IBM产品化步伐缓慢的3个原因是:IBM重视信誉,重视质量,尽量减少故障;IBM是个大公司,行政体系庞大;IBM内部已经有层次数据库产品,相关人员不积极,甚至反对。

1973年加州大学伯克利分校的Michael Stonebraker和Eugene Wong利用System R已发布的信息开始开发自己的关系数据库系统Ingres。他们开发的Ingres项目最后由Oracle公司、Ingres公司及硅谷的其他厂商所商品化。后来,System R和Ingres系统双双获得ACM的1988年“软件系统奖”。

1976年霍尼韦尔公司(Honeywell)开发了第一个商用关系数据库系统Multics Relational Data Store。关系型数据库系统以关系代数为坚实的理论基础经过几十年的发展和实际应用,技术越来越成熟和完善。其代表产品有甲骨文公司的Oracle、IBM公司的DB2、微软公司的MS SQL Server,以及Informix、ADA BASD。

2.概述

关系模型的主要特征是用二维表格表达实体集。与前两种模型相比,其数据结构简单,容易理解,可以表示一对一、一对多、多对多的关系。关系模型是由若干个关系模式组成的集合。学生课程的关系模型如图2-10所示,数据如图2-11所示。

图2-10 学生-课程的关系模型

图2-11 学生-课程的关系数据

根据关系数据理论和Codd准则的定义,一种语言必须能处理与数据库的所有通信问题,这种语言有时也称为综合数据专用语言,该语言在关系型数据库管理系统中就是SQL。SQL的使用主要通过数据操纵、数据定义和数据管理3种操作实现。

关系模型的完整性规则是对数据的约束。关系模型提供了3类完整性规则:实体完整性规则、参照完整性规则和用户定义完整性规则。其中,实体完整性规则和参照完整性规则是关系模型必须满足的完整性约束条件,称为关系完整性规则。

(1)实体完整性

实体完整性指关系的主属性(主键的组成部分)不能是空值。现实世界中的实体是可区分的,即它们具有某种唯一性标识。相应地,关系模型中以主键作为唯一性标识,主键中的属性即主属性不能取空值(“不知道”或“无意义”的值)。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与现实世界的环境相矛盾,因此这个实体一定不是一个完整的实体。例如“学生表”中的属性“学号”不能为空。

(2)参照完整性

如果关系的外键R1与关系R2中的主键相符,那么外键的每个值必须在关系R2中主键的值中找到或者其为空值。例如,“课程表”的属性“学号”必须与“学生表”的属性“学号”相符。

(3)用户定义完整性

它是针对某一具体的实际数据库的约束条件,由应用环境所决定,反映某一具体应用所涉及的数据必须满足的要求。关系模型提供定义和检验这类完整性的机制,以便用统一、系统的方法处理,而不必由应用程序承担这一功能。例如,“成绩表”中的属性“成绩”的取值范围在0-100之间,就是用户定义的完整性。

3.基本概念

在现实世界中,要描述一个事物,常常取其若干特征来表示。这些特征称为属性。例如,大学生可用姓名、学号、性别、系别等属性来描述。每个属性对应一个值的集合,作为其可以取值的范围,称为属性的域。例如,姓名的域是所有合法姓名的集合,性别的域是{男,女}等。

一个对象可以用一个或多个关系来表示。关系就是定义在它的所有属性域上的多元关系。设为R,它有属性A1、A2、…、An,其对应的域分别为D1、D2、…、Dn,则关系R可表示为:R=(A1/D1,A2/D2,…,An/Dn)或R=(A1,A2,…,An)。元组是关系中各属性的一个取值的集合。

关系数据库的特点在于它将每个具有相同属性的数据独立地存在一个表中。对任何一个表而言,用户可以新增、删除和修改表中的数据,而不会影响表中的其他数据。下面介绍关系数据库中的一些基本术语。

①候选码(Key):关系中的某一属性或属性组的值唯一地决定其他所有属性的值,也就是唯一地决定一个元组,而其任何真子集无此性质,则称这个属性或属性组为该关系的候选码。

②主码(Primary Key):它是被挑选出来作为表行的唯一标识的候选码,一个表中只有一个主码。主码又称为主键。主码可以由一个字段,也可以由多个字段组成,分别称为单字段主码或多字段主码,主码又称主键。

③外码(Foreign Key):如果一个码在一个关系中是主码,则在另一个关系中是外码。由此可见,外码表示了两个关系之间的联系,外码又称为外键。

例如图2-11中,“学号”是“学生表”的主码,“成绩表”中“学号”则是外码,“学号”+“课程号”是“成绩表”的主码,“课程号”是“课程表”的主码。所有主码在没有被选为主码前都是候选码,候选码可以有多个,而主码有一个。如果“学生表”同时有“学号”和“身份证”两个属性,这两个属性都能唯一地确定一个元组,因此,两个属性都是“候选码”,可以选择任意一个作为主码。

4.关系的性质

关系模型原理的核心是“规范化”概念,规范化是把数据库组织成在保持存储数据完整性的同时最小化冗余数据的结构的过程。规范化的数据库是符合关系模型规则的数据库,通常把这些规则称为范式。

范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求即满足不同的范式。目前关系数据库有6种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。在实际的数据库设计过程中,通常需要用到的是前三类范式。

关系模型的优点是:结构简单,容易被用户理解,数据具有独立性,采用非过程化的数据请求,用户不需要知道数据存储的细节——更重要的是关系模型具有坚实的理论基础。当然,关系模型也存在数据类型表达能力差、复杂查询的功能较弱等缺点。关系模型有如下特点:

①关系是一个二维表,表中的每一行对应一个元组,表中的每一列有一个属性名且对应一个域。列是同质的,即每一列的值来自同一域。

②关系中的每一个属性不可再分解,即所有域都应是原子数据的集合。

③关系中任意两个元组不能完全相同。关系中行的排列顺序、列的排列顺序是无关紧要的。每个关系都由关键字的属性集唯一标识各元组。

2.2.4 面向对象数据模型

随着信息技术和市场的发展,人们发现关系型数据库系统虽然技术很成熟,但其局限性也是显而易见的:它能很好地处理所谓的“表格型数据”,却对技术界出现的越来越多的复杂类型的数据无能为力。20世纪90年代以后,技术界一直在研究和寻求新型数据库系统。但在什么是新型数据库系统的发展方向的问题上,产业界一度相当困惑。受当时技术风潮的影响,在相当一段时间内,人们把大量精力花在研究“面向对象的数据库系统(Object Oriented Database)”或简称“OO数据库系统”上。值得一提的是,美国Stonebraker教授提出的面向对象的关系型数据库理论曾一度受到产业界的青睐。而Stonebraker本人也在当时被Informix花大价钱聘为技术总负责人。

面向对象的关系型数据库系统产品的市场发展情况并不理想。理论上的完美并没有带来市场的热烈反应。其不成功的主要原因在于,这种数据库产品的主要设计思想是企图用新型数据库系统来取代现有的数据库系统。这对许多已经运用数据库系统多年并积累了大量工作数据的客户,尤其是大客户来说,他们是无法承受新旧数据间的转换而带来的巨大工作量及巨额开支的。另外,面向对象的关系型数据库系统使查询语言变得极其复杂,从而使得无论是数据库的开发商家还是应用客户都视其复杂的应用技术为畏途。

1.对象和对象标识符

面向对象数据模型(Object-Oriented Data Model,OO数据模型)是面向对象程序设计方法与数据库技术相结合的产物,用以支持非传统应用领域对数据模型提出的新需求。在面向对象数据模型中,所有现实世界中的实体都模拟为对象,小至一个整数、字符串,大至一个公司、一部电影,都可以看成对象,每个对象都有一个系统内唯一不变的标识符,称为对象标识符(OID)。OID一般由系统产生,用户不得修改。OID是区别对象的唯一标识,与对象的属性值无关。

①如果对象的属性值和方法一样,但OID不同,则仍认为是两个“相等”而不同的对象。

②如果一个对象的属性值修改了,只要其标识符不变,则仍认为是同一对象。因此,OID可看成是对象的替身,以构造更复杂的对象。一个对象一般是由一组属性、一组方法、一个OID组成的。

每个对象包含若干属性,用以描述对象的状态、组成和特性。属性也是对象,它又可能包含其他对象作为其属性。这种递归引用对象的过程可以继续下去,从而组成各种复杂的对象。除了属性外,对象还包含若干方法,用以描述对象的行为特性。方法又称为操作,它可以改变对象的状态,对对象进行各种数据库操作。方法的定义与表示包含两个部分:一是方法的接口,说明方法的名称、参数和结果的类型;二是方法的实现部分,是用程序编写的一个过程,以实现方法的功能。面向对象逻辑模型如图2-12所示。

图2-12 面向对象逻辑模型

2.封装和消息传递

在OO数据模型中,系统把一个对象的属性和方法封装成一个整体。对象的封装性体现在以下3个方面:①对象具有清晰的边界;②对象具有统一的外部接口;③对象的内部实现是不公开的。对象是封装的,对象与外界、对象之间的通信一般只能借助于消息。消息传送给对象,调用对象的相应方法,进行相应的操作,再以消息形式返回操作的结果。这种通信机制称为消息传递。消息一般由操作者、接收者、操作参数3个部分组成。对象、消息之间的关系如图2-13所示。

图2-13 对象的消息传递

3.类和实例

类是具有共同属性和方法的对象的集合,这些属性和方法可以在类中统一说明。同类对象在数据结构和操作性质方面具有共性。例如,大学生、研究生是一些有共同性质的对象,能抽象为一个学生。类中每个对象称为该类的一个实例。同一个类中,对象的属性名虽然是相同的,但这些属性的取值会因各实例而异。图2-14(a)所示为学生类,图2-14(b)所示为该学生类的一个实例。

在一些OO数据模型中,类视为对象,因此由类可以组成新的类。这种由类组成的类称为元类,元类的实例是类。图2-15(a)所示的班级类是图2-15(b)中学生类的组成部分,因此学生类为元类。

图2-14 类和实例

图2-15 元类的实例

在类层次结构中,一个类的下层可以是多个子类;一个类的上层也可以有多个超类。在类继承时,可能发生属性名和方法名的同名冲突:①各超类之间的冲突;②子类与超类之间的冲突。

在关系数据模型中基本数据结构是表,这相当于OO数据模型中的类,而关系中的数据元组相当于OO数据模型中的实例。在关系数据模型中,对数据库的操作都归结为对关系的运算,而在OO数据模型中,对类层次结构的操作分为两部分:一是封装在类内的操作,即方法;二是类间相互沟通的操作,即消息。在关系数据模型中有域、实体和参照完整性约束。完整性约束条件可以用逻辑公式表示,称为完整性约束方法。在OO数据模型中,这些用于约束的公式可以用方法或消息表示,称为完整性约束消息。