逻辑数据模型(Logical Data Model),又称为逻辑模型,是一种面向数据库系统的模型,是具体DBMS所支持的数据模型,如层次数据模型、网状数据模型、关系数据模型、面向对象数据模型、扩展关系数据模型等。这些模型既要面向用户,又要面向系统,主要用于DBMS的实现。
20世纪60年代以前,人们采用文件系统进行数据管理,这种方式以分散、互相独立的数据文件为基础,不可避免地存在数据冗余、数据不一致、处理效率低等问题。这些问题在较大规模的系统中尤为突出。
美国在20世纪六七十年代开展了名为“阿波罗计划”的研究。当时“阿波罗”飞船由约200万个零部件组成,分散在世界各地制造。为了掌握计划进度及协调工程进展,“阿波罗计划”的总承包商北美Rockwell公司(现Rockwell International Corporation)曾在文件管理系统的基础上开发了一个计算机零部件管理系统。这个系统共用了18盘磁带,虽然可以工作,但效率极低,哪怕是一个小小的修改,都会带来“牵一发而动全身”的后果,维护起来十分困难。这18盘磁带的数据中有60%是冗余的。数据冗余引起的问题促使Rockwell公司开发出一种被称为GUAM(通用更新访问方法,Generalized Update Access Method)的软件,该软件构建的原理是,许多较小的零件将聚集组建成更大部件,持续下去,直到所有部件形成最终的装置。20世纪60年代中期,IBM公司与Rockwell公司联合,用更现代的磁盘存储器(允许使用复杂的指针系统)取代计算机磁带,从而扩充了GUAM的能力。
Rockwell公司与IBM公司共同努力的结果就是形成了IMS(信息管理系统,Information Management System),为“阿波罗”飞船在1969年顺利登月奠定了良好基础。由于IBM公司的开发实力和市场影响,IMS在20世纪70年代和80年代早期成为世界领先的大型机层次数据库系统。
IMS是采用层次数据模型的数据库的典型代表。层次数据模型(Hierarchical Data Model)又称为层次模型,它用一棵倒立的“有向树”的数据结构来表示各类实体以及实体间的联系。这棵“有向树”由根节点和若干棵子树构成。每个节点有零个或多个子节点,如图2.24所示。树有且仅有一个节点没有父节点,这个节点称为 根节点 ;根以外的其他节点有且只有一个父节点。除了根节点外,每个子节点可以分为多个不相交的子树;没有子节点的节点称为 叶节点 。
图2.24 自然界的树与数据结构的树
层次模型用一棵倒立的“有向树”的数据结构来表示各类实体以及实体间的联系。在树中,每个节点表示一个记录类型,节点间的连线表示记录类型间的联系,每个记录类型可包含若干个字段,记录类型描述的是实体,字段描述的是实体的属性,各个记录类型及其字段都必须命名,且各个记录类型、同一记录类型中各个字段不能同名。每个记录类型可以定义一个排序字段,也称码字段,如果定义该排序字段的值是唯一的,则它能唯一地标识一个记录值。如果要存取某一记录类型的记录,可以从根节点起,按照有向树层次向下查找。
【例2.14】 图2.25展示了一个“学生”层次模型,它包含了“学院”“系”“实验室”“班”和“学生”5个记录类型。“学院”包含学院编号、院名、院办公地点等字段;“系”包含系编号、系名、系办公地点等字段;“实验室”包含实验室编号、实验室名、实验室地点等字段;“班”包含班编号和班名两个字段;“学生”包含学号、身份证号、姓名、性别和生日等字段。图2.26显示的是对应图2.25的一个实例,有软件学院、软件工程系、计算中心、21软件工程3班、张怡等5个记录值。
图2.25 学生层次模型
图2.26 学生层次模型的实例
(1)层次模型支持的数据操作
层次模型支持的数据操作主要有查询、插入、删除和更新。插入、删除和更新操作要满足层次模型的完整性约束条件,具体如下:
1)进行插入操作时,如果没有相应的父节点值就不能插入它的子节点值。例如,在例2.14的层次数据库中,在新调入一名学生,但尚未将他分配到某个班时,就不能将该学生插入数据库中。
2)进行删除操作时,如果删除父节点值,则相应的子节点值也被同时删除。例如,在例2.14的层次数据库中,如果删除了21软件工程3班,则该班所有学生的数据会全部丢失。
3)进行更新操作时,应更新所有相应记录,以保证数据的一致性。
(2)层次模型的优点
层次模型适用于表示现实世界中有“上下辈”分层级的事物以及事物间具有1: N 联系的情况,如制造流程、行政层次、家族关系、银行的客户账户系统等。层次模型具有以下优点:
1)层次模型的数据结构比较简单、清晰。基于层次结构的数据库,各层之间的联系在逻辑上(或概念上)简单并且设计也简单。
2)层次数据库查询效率高。层次模型中记录之间的联系用有向边表示,这种联系在DBMS中常常用指针来实现,因此这种联系也就是记录之间的存取路径。当要存取某个节点的记录值时,DBMS沿着这一条路径就可以很快找到该记录值,因此层次数据库的性能优于关系数据库,不低于网状数据库。
3)层次模型提供了良好的完整性支持。给定父/子联系,在父记录和它的子记录之间存在链接。由于子记录是自动引用它的父记录的,所以这种模式保证了数据完整性。
4)层次数据库实现了数据共享。因为所有数据都保存在公共数据库里,所以数据共享成为现实。
5)层次模型具有数据安全保障。层次模型是第一个由DBMS提供和强制数据安全的数据库模型。
(3)层次模型的缺陷
层次模型存在以下缺陷:
1)表示的局限性:现实世界中很多联系是多对多联系,不适合用层次模型表示。
2)实现复杂:虽然层次数据库概念简单、容易设计而且没有数据依赖性问题,但实现起来特别复杂。由于使用导航式结构,数据库设计者必须具备一定的关于物理数据存储特性的知识。数据库结构的任何变化都要求所有访问数据库的应用程序随之改变。因此,数据库设计的实现变得非常复杂。
3)缺乏结构独立性:结构独立性是指数据库结构的改变不会影响DBMS访问数据的能力。层次数据库被称为导航式系统,这是因为其数据访问要求使用前序遍历导航到合适的记录。所以,应用程序应该掌握从数据库访问数据的相关访问路径。物理结构的修改或变化会导致应用程序出现问题,这就要求必须随之修改应用程序。在层次数据库系统中,结构依赖使得数据独立性是非常有限的,数据库和应用程序的维护也变得非常困难。
4)应用程序编写复杂:编写应用程序非常费时和复杂。由于导航式结构,查询子节点必须通过父节点,应用程序编程人员和终端用户必须准确地掌握数据库中数据的物理描述以及访问数据的控制代码,这要求具有复杂指针系统的知识,普通用户往往不具备这些知识。此外,对数据插入和删除操作的限制比较多,因此应用程序的编写复杂、耗时。
5)缺乏标准:在层次模型里,没有精确的标准概念集,也没有明确指定模型执行的特定标准。
20世纪60年代,在层次数据库产品问世的同时,在通用电气公司任职程序设计部门经理的Charles W. Bachman主持设计与开发了最早的网状数据库管理系统IDS(Integrated Data System)。IDS于1964年推出后,成为最受欢迎的数据库产品之一,而且它的设计思想和实现技术被后来的许多数据库产品所效仿。后来,在Bachman积极推动下,美国数据系统语言会议(CODASYL)下属的数据库任务组(DBTG)提出了网状数据库模型以及数据定义语言(Data Definition Language,DDL)和数据操纵语言(Data Manipulation Language,DML)的规范说明,并于1971年推出了第一个正式报告——DBTG报告。
DBTG报告明确了数据库管理员(Database Administrator,DBA)的概念,规定了DBA的作用与地位,并首次确定了数据库的三层体系结构,包括模式(Schema)、子模式(Subschema)、物理模式(Physical Schema)。模式对应数据库的概念层,是对数据库中数据整体逻辑结构的描述,由DBA使用DDL定义。子模式对应于数据库的外层或用户视图(user view),是某一用户对他所关心的那部分数据的逻辑结构的描述,由该用户自己或委托DBA使用子模式DDL定义。物理模式也叫存储模式(Storage Schema),对应于数据库的物理层,是对数据库数据存储组织方式的描述,由DBA通过数据存储描述语言(Data Storage Description Language,DSDL)定义。在DBMS的控制下,用户借助应用程序通过DML引用某一模式的子模式操纵数据库中的数据。这些数据被找到之后,将被放置于名为用户工作区(User Work Area,UWA)的数据缓冲区中,等待应用程序的访问。DBTG体系结构如图2.27所示。
图2.27 DBTG体系结构
DBTG报告是数据库历史上具有里程碑意义的文献。DBTG报告描述的虽然是一种方案而非实际的数据库,但它所提出的基本概念却具有普遍意义,不仅国际上大多数网状数据库管理系统,如IDMS、PRIMEDBMS、DMSl70、DMSⅡ和DMS1100等都遵循或基本遵循DBTG模型,而且后来产生和发展的关系数据库技术也深受它的影响,关系DBMS的体系结构也遵循DBTG的三级模式。
在DBTG报告中基于IDS的经验所确定的方法称为DBTG方法或CODASYL方法。被世人公认为“网状数据库之父”或“DBTG之父”的Bachman因在数据库技术方面做出了杰出的贡献,成为1973年图灵奖获得者。
网状数据模型(Network Data Model)又称为网状模型,它使用一种名为“有向图”的数据结构表示实体类型及实体之间的联系。在这个有向图中,每个节点表示一个记录型(实体型),每个记录型可包含若干个字段(实体型的属性),节点间的连线表示记录型(实体型)间的父子关系。网状模型中允许有一个及以上节点无父节点,至少有一个节点可以有多于一个父节点。有向图如图2.28所示,节点A和B没有父节点,而节点C和D有两个父节点。
图2.29展示了一个学生所属组织网状模型,它包含了“班”“社团”和“学生”等三个记录型。“班”包含班编号和班名两个字段;“社团”包含社团编号、社团名称和活动地点等三个字段;“学生”包含学号、身份证号、姓名、性别和生日等字段。图2.30显示的是对应图2.29的一个实例,有21软件工程3班、张怡、舞蹈团、小程序开发俱乐部等记录值。
图2.28 有向图
图2.29 学生所属组织网状模型
图2.30 学生所属组织网状模型的实例
与层次模型不同,在网状模型中子节点与父节点的联系不是唯一的,因此,在网状模型中要为每个联系命名,并指出构成该联系的父节点和子节点。我们把两个或两个以上的记录型之间的联系称为系类型。一个系类型就是一棵二级树。在一个系类型中,有一个记录型处于主导地位,称为 系主记录类型 ,其他称为 成员记录类型 。系主和成员之间的联系是一对多的联系。例如,可将图2.29的学生所属组织网状模型转换为图2.31的两个系类型。其中,“班”和“社团”为这两个系类型的系主记录类型,“学生”为成员记录类型。
图2.31 学生所属组织网状模型转换为两个系类型
(1)网状模型支持的数据操作
网状模型支持的数据操作主要有查询、插入、删除和更新。插入、删除、更新操作要满足层次模型的完整性约束条件,具体如下:
1)进行插入操作时,允许插入尚未确定父节点的子节点。例如,可插入一些刚来报到但还未分配到班的学生信息,也可插入一名尚未参加社团的新同学信息。
2)进行删除操作时,允许只删除父节点。例如,一个社团解散了,可只删除社团节点,而该社团所有学生的信息仍保留在数据库中。
3)进行更新操作时,只需更新指定记录即可。
(2)网状模型的优点
网状模型没有层次模型那样严格的完整性约束条件,相比于层次模型,网状模型的适用范围更广,它具有以下优点:
1)网状模型能够更为直接地描述客观世界中实体间的复杂联系。
2)网状模型中节点间的联系简单,数据访问灵活,存取效率较高。
3)网状模型有对应的数据库行业标准,使得基于网状模型的数据库产品大受欢迎。
(3)网状模型的缺陷
网状模型存在着以下缺陷:
1)与层次模型相比,网状模型的结构更加复杂。涉及实体越多,数据库的结构就越复杂,不利于用户使用。
2)与层次模型类似的是,在网状模型中,由于实体间的联系本质上是通过存取路径表示的,因此应用程序在访问数据时要指定存取路径,这导致网状数据库的结构独立性较差。
层次模型和网状模型被称为第一代数据模型。基于层次模型和网状模型的数据库产品虽然已经很好地解决了数据的集中管理和共享问题,但是在数据独立性和抽象级别上仍存在很大的欠缺。用户要存取这两种数据库,就需要深入了解数据本身的导航结构,并由专业的程序员编写代码来实现数据的存取,信息检索是非常复杂的任务。
为了解决上述问题,1970年,IBM的研究员Edgar Frank Codd博士发表了题为“A Relational Model of Data for Large Shared Data Banks”的论文,建议将数据独立于硬件来存储,程序员使用非过程语言来访问数据。他在论文中首次提出了关系数据模型的概念,开启了对关系数据库方法和数据规范化理论的研究。关系数据模型(Relational Data Model)又称为关系模型,它提供了关系操作的特点和功能要求,但对DBMS的语言没有具体的语法要求。对关系数据库的操作是高度非过程化的,数据库用户或应用程序查询数据时不需要知道该数据的结构,数据存取路径的选择由DBMS的优化机制来完成。由于关系模型具有坚实的数学理论基础且简单明了,一经提出就受到了学术界和产业界的高度重视和广泛应用,并快速成为数据库市场的主流。因在关系数据库方面的杰出贡献,Codd博士被称为“关系数据库之父”,并获得了1981年的图灵奖。这篇论文还于1983年被美国计算机协会评为自1958年以来的1/4个世纪中具有里程碑式意义的最重要的25篇研究论文之一。
令人遗憾的是,在这篇研究论文发表之时,IBM已经投资了IMS,对关系数据库理论没有给予足够的重视。Larry Ellison却发现了关系数据库潜在的巨大商业利益,他在1977年与Ed Oates和Bob Miner一起研制了世界上第一个商用关系数据库管理系统,并创办了Oracle公司。这家公司后来不断发展壮大,成为IBM在数据库领域的最大竞争对手。
1973年IBM启动了一个研究项目,创建了一个名为System R的数据库系统。该项目是一个具有开创性的项目,它第一次实现了SQL语言,从此SQL成为标准关系数据库查询语言;它还首次论证了关系数据库管理系统能够提供良好的事务处理性能。System R中的设计决策以及一些基本的选择算法对后来的关系系统产生了巨大的影响。
20世纪70年代早期,System R项目组发表了一系列关于关系数据库的文章,引起了加利福尼亚大学伯克利分校的两位科学家Michael Stonebraker和Eugene Wong的强烈关注,于是他们也启动了一个关系数据库的研究项目——Ingres(Interactive Graphics and Retrieval System,交互式图形和检索系统)。Ingres在概念上与System R相似,但是它基于比较低端的系统,主要是UNIX和DEC。Ingres项目在20世纪80年代早期结束。从20世纪80年代中期开始,在Ingres基础上产生了很多商业数据库软件,包括Sybase、Microsoft SQL Server、NonStop SQL、Informix等。在20世纪80年代中期启动了Ingres的后继项目Postgres,并产生了PostgreSQL、Illustra。无论从何种意义上来说,Ingres都是历史上最有影响的计算机研究项目之一。1988年,System R和Ingres双双获得美国计算机协会颁发的“软件系统奖”。
在关系模型中,无论是实体还是实体之间的联系均用关系(relation)来表示。每个关系的数据结构均是一个规范化的二维表。在这个二维表中,每一行称为元组,也叫记录;每一列是一个属性,也称为字段。关系中元组的一个属性值称为分量。“学生”关系的属性和分量如图2.32所示。
图2.32 “学生”关系
在设计数据库时,我们常把关系形式化地表示为:关系名(属性1,属性2,…,属性 n ,…)。这种关系的形式化描述称为关系模式。例如,前面描述的“学生”关系,其关系模式可表示成:学生(学号,身份证号,姓名,性别,生日)。关系模式相当于一个表的抽象框架,是相对稳定的。当我们往框架里面填入具体的数据之后,每一个元组可以称为关系实例。关系会随着数据的插入、删除和修改而发生变化。
(1)关系模型支持的数据操作
关系模型支持的数据操作主要包括查询、插入、删除和修改,这些操作必须满足关系的完整性约束条件,即实体完整性、参照完整性和用户定义的完整性。关系的完整性约束的具体含义以及关系模型的概念和理论知识将在第4章中详细介绍。
(2)关系模型的优点
关系模型被称为第二代数据模型,它具有以下优点:
1)与非关系模型不同,它有较强的数学理论根据。
2)数据结构简单、清晰,用户易懂易用。在关系模型中,数据模型是一些表格的框架,实体通过关系的属性(即表格的栏目)表示,实体之间的联系通过这些表格中的公共属性(可以不同属性名,但必须同域)表示。结构非常简单,非专业人员一看就能明白。
3)关系数据库语言是非过程化的,用户只需要指出“做什么”,而不必详细说明“怎么做”。用户对数据的操作可以不涉及数据的物理存储位置,只需给出数据所在的表、属性等有关数据自身的特性即可。这将用户从需编程实现的数据库记录导航式检索中解脱了出来,大大降低了用户编程的难度,同时提高了数据的独立性。
4)在关系模型中,操作的基本对象是关系,关系是一个集合而不是某一个元组。在非关系模型中,操作对象是单个记录;关系模型中的数据操作是面向集合的操作,操作对象和操作结果都是关系,即若干元组的集合,对于用户而言,这提高了数据访问的便利程度。
(3)关系模型的缺陷
没有一种数据模型是完美的,关系模型也不例外,它存在以下这些不足:
1)在关系模型中,复合属性往往需要拆分成若干个简单属性,例如“地址”属性,可包含省份、城市、街道、邮编等信息。如果直接使用字符串存储地址的全部信息,则不利于数据的检索、更新和删除。然而,“地址”被拆分之后,省份、城市、街道、邮编等作为独立的属性存在,会割裂数据间的层次关系。
2)关系模型不能表示变长的属性。例如,保卫处负责校园门禁管理和人员的户籍管理,建立了“户籍”文件存储教师的工号、姓名、性别、班级、籍贯、户口所在地、电话、配偶、子女等信息,由于所有教师的子女数目不是统一的值,为了兼容子女数目多的情况,可设置多个子女属性列,如“子女1”“子女2”等。子女属性列若设置得过少,则不能满足使用需求;若设置得过多,则浪费存储空间。关系模型不支持可变数组和嵌套表格,对于这种情况的处理缺乏灵活性。
3)关系模型简单易用,大大降低了用户设计和使用的门槛,有可能助长一些拙劣的数据库设计和实现。
4)由于关系模型提供了较高的数据独立性和非过程化的查询功能,查询的时候只需指明数据所在的表和列,具体的查找路径由系统来指定,因此系统性能面临更高的要求。
面向对象的基本概念是20世纪70年代提出的,它的基本思想是对问题领域进行自然的分割,用更接近人类的思维方式建立问题领域的模型,并进行结构模拟和行为模拟,从而使设计出的软件能尽可能直接地表现出问题的求解过程。
面向对象的方法把系统工程中的某个模块或构件视为问题空间的一个或一类对象。 对象 (object)表示现实世界中的实体。一名学生、一门课程、一次选修记录都可以看作对象。每个对象包含一组属性和一组方法。 属性 用来描述对象的状态、组成和特性,是对象的静态特征,如学生的姓名、性别等。 方法 是用来改变对象一个或多个属性的值的操作(通常使用函数过程实现),是对象的动态特征。在对象状态上操作的方法集称为对象的 行为 。具有相同的属性集和方法集的所有对象的集合称为 类 (class)。类允许嵌套结构。现有的类称为 超类 ,子类是从现有类派生出来的,称为 派生类 。子类 继承 了超类上定义的全部属性和方法,从而实现软件的可重用性。同时,子类本身还可包含其他属性和方法。通过继承构造了子类后,还可以为每个子类指定其独特的表现行为,这称为 多态 。继承体现了这些对象的共性,多态则体现了每个对象的个性。在前文例2.9中,若定义大学里的人员为一个类,属性包括身份证号、姓名、性别、生日等,从人员类中可派生出两个子类:教师和学生。教师和学生能继承人员类包含的所有属性,还能定义自身特有的属性,如教师可包含工号属性,学生可包含学号属性。
每一个对象都是一系列属性和方法的 封装 。用户虽能看见对象封装界面上的信息,却看不见对象内部的细节。封装的目的是使对象的使用和实现分开,使用者只需通过消息来访问对象,而不必知道行为实现的细节。这种数据与操作统一的建模方法既提升了用户使用程序的便利程度,也有利于程序的模块化,增强了系统的可维护性。
由于面向对象的思想简单、直观,十分接近人类分析和处理问题的自然思维方式,同时又能有效地组织和管理不同类型的数据,因此面向对象的程序设计方法成为目前程序设计的主要方法之一。
无论是第一代层次模型和网状模型,还是第二代关系模型,它们都存在以下不足:采用简单固定的数据类型,不能表示复杂的数据和嵌套数据;只能实现实体之间的简单联系,不能实现实体间聚合、继承等复杂联系;结构与行为分离,模拟数据和行为的能力不足。随着数据环境和系统需求变得越来越复杂,一方面传统的数据库产品显得力不从心,另一方面生成和维护日益复杂的计算机程序所需要的成本也越来越高。
为了弥补传统数据模型的不足,并进一步降低信息系统的开发成本,增强系统的可维护性,20世纪90年代数据库技术领域引入了面向对象的程序设计方法。面向对象数据模型(object oriented data model)采用面向对象的方法来设计数据库。面向对象的数据库以对象为单位存储内容,每个对象均包含对象的属性和方法,具有类和继承等特点。面向对象数据模型既继承了关系模型已有的优势、特性,又支持面向对象建模、基于对象的存取与持久化以及代码级面向对象的数据操作,从而成为现在较为流行的新型数据模型,在电信、金融和互联网应用等涉及多媒体信息管理及实体关系非常复杂的场景中备受欢迎。Computer Associates公司的Jasmine就是面向对象数据模型的数据库系统。
(1)面向对象数据模型的优点
1)适合处理各种各样的数据类型。与传统的数据库(如层次数据库、网状数据库或关系数据库)不同,面向对象数据库适合存储不同类型的数据,如图片、声音、视频、文本、数字等。
2)提高开发效率。面向对象数据模型结合了面向对象程序设计方法与数据库技术,从而提供了一个集成应用开发系统的方法。面向对象数据模型具有继承、多态和动态绑定等特性,用户无须编写特定对象的代码就可以构成对象并提供解决方案,从而有效地提高数据库应用程序开发人员的开发效率。
3)改善数据访问。面向对象数据模型明确地表示联系,支持用导航式和关联式两种方式访问信息。它比基于关系值的联系更能提高数据访问性能。
(2)面向对象数据模型的缺陷
1)没有准确的定义。面向对象数据模型很难提供一个准确的定义来说明面向对象DBMS是什么样的,这是因为很多不同的产品和原型都称自己用到面向对象DBMS,但这些产品和原型考虑的方面是不一样的。
2)维护困难。组织的信息需求改变时,对象的定义也要随之改变,并且需移植现有数据库,以完成新对象的定义。在改变对象的定义和移植数据库时,面向对象数据模型可能面临真正的挑战。
3)不适合所有应用。面向对象数据模型适用于需要管理数据对象之间复杂关系的应用,特别适用于特定的应用,如工程、电子商务、医疗等;面向对象数据模型并不适合所有应用,当用于普通应用时,其性能会降低并要求很高的处理能力。