【概述】
数据库领域主流的逻辑模型随着时代的发展不断在变化,格式化模型(层次模型、网状模型)在 20 世纪 70 年代到 80 年代初期十分流行,占据主导地位,但现在已逐渐被关系模型的数据库系统取代
同时,自 80 年代面向对象技术在计算机各领域广泛应用后,数据库领域针对于面向对象方法也进行了研究,这就有了面向对象模型,之后为进一步支持面向对象模型,许多数据库厂商对关系模型进行了扩展,这就产生了对象关系数据模型
随着 Internet 的发展,Web 上各种半结构化、结构化数据源成为了重要的信息来源,这又促进产生了半结构化数据模型和非结构数据模型
限于篇幅,本篇仅简单介绍基本已被淘汰的格式化模型
【层次模型】
介绍
层次模型是最早出现的逻辑模型,其和概念模型最接近,用树形结构来表示各类实体以及实体间的关系,典型代表是 IBM 公司的 IMS 数据库管理系统
层次模型的数据结构简单清晰,查询效率高,性能优于关系模型,不低于网状模型,还提供了良好的完整性支持,但多对多联系表示不自然,对插入和删除操作的限制多,应用程序的编写比较复杂,查询子结点必须通过父结点,结构严密,层次命令趋于程序化
数据模型组成要素
层次模型的数据结构满足以下两个基本条件:
- 有且仅有一个结点没有父结点,这个结点称为根结点
- 根结点以外的结点有且仅有一个父结点
在层次模型进行表示时,采取如下方法:
- 实体型:用记录类型描述,每个结点表示一个记录类型(实体)
- 属性:用字段描述,每个记录类型包含若干字段
- 联系:用结点间的连线表示实体间的一对多的父子联系
如下图,是一个教员学生层次模型,该模型有 4 个记录类型,代表着 4 个不同的实体,每个类型根据实际需要划分为若干字段,每个字段代表一个属性,每个实体之间的连线代表着彼此间的关系
下图是教员学生层次模型对应的一个值
层次模型的数据操纵主要有:查询、插入、删除、更新
在进行插入、删除、查询操作时,要满足层次模型的完整性约束条件,即:
- 插入:没有父结点值,就不能插入子结点值
- 删除:删除父结点值,要删除相应子结点值
- 查询:查询子结点值,必须通过父结点值查询
通过上述介绍可以发现,层次模型只能处理一对多的实体联系,同时,任何记录值只有按路径查看时,才能显示其全部意义,此外,任何一个子结点记录值都不可脱离父结点记录值独立存在
多对多联系的表示
如果想要用层次模型表示多对多的实体联系,那么就要将多对多联系分解成一对多联系,间接来表示多对多联系,常见的方法有冗余结点法、虚拟结点法
如下图所示,是一个学生选课的多对多联系
当采用冗余结点法转换为一对多联系时,有:
当采用虚拟结点法转换为一对多联系时,有:
存储结构
层次模型的存储需要存储数据本身和数据间的联系,有邻接法、链接法(孩子-兄弟链接法、层次序列链接法)两种方法
邻接法是按照层次树前序遍历的顺序将所有记录值依次邻接存放,即通过物理空间的位置相邻来实现层次顺序
孩子-兄弟链接法是将每个记录设两类指针,分别指向最左边的孩子和最近的兄弟
层次序列链接法是按层次树的前序穿越顺序链接各记录值
【网状模型】
介绍
网状数据库系统采用网状模型作为数据的组织方式,典型代表是 DBTG 系统(CODASYL 系统),其是数据系统语言研究会(CODASYL)下属的数据库任务组(Database Task Group,DBTG)提出的一个系统方案,其并不是一个实际的数据库系统软件,其基本概念、方法、技术具有普遍意义,后续不少系统均采用 DBTG 模型作为实际的网状模型
网状模型能够更为直接地描述现实世界,其具有良好的性能,存取效率较高,但结构比较复杂,且随着应用环境的扩大,数据库的结构越来越复杂,不利于用户掌握,同时,DDL、DML 语言复杂,不容易使用,此外,记录类型联系变动后涉及链接指针的调整,扩充和维护都比较复杂
数据模型组成要素
网状模型的数据结构满足以下两个基本条件:
- 允许一个以上的结点没有父结点
- 一个节点可以有多个父结点
在网状模型进行表示时,采取如下方法:
- 实体型:用记录类型描述,每个结点表示一个记录类型(实体)
- 属性:用字段描述,每个记录类型包含若干字段
- 联系:用结点间的连线表示实体间的一对多的父子联系
网状模型中子结点与父结点的联系可以不唯一(层次模型中的联系必须唯一),这就要求为每个联系进行命名,并指出与该联系有关的父亲记录和孩子记录
如下图,是一个学生选课数据库的网状模型
网状模型的数据操纵主要有:查询、插入、删除、更新
但网状模型的完整性约束条件不像层次模型那么严格,具体的数据库系统有着不同的限制,以 DBTG 来说,其在模式数据定义语言中提供了定义 DBTG 数据库完整性的若干概念和语句,主要有:
- 记录码:唯一标识记录的数据项的集合
- 一个联系中父记录与子记录间是一对多联系
- 支持父记录与子记录间的某些约束条件(子记录插入时要求父记录存在、父记录删除时连同子记录一起删除等)
多对多联系的表示
如果想要用网状模型表示多对多的实体联系,那么就要将多对多联系分解成一对多联系,间接来表示多对多联系
例如:一个学生可以选修若干门课程,某一课程可以被多个学生选修,学生与课程之间是多对多联系
为在网状模型中表示这种多对多联系,可以引进一个学生选课的联结记录,其由 3 个数据项组成:学号、课程号、成绩,从而表示某个学生选修某一门课程及其成绩
存储结构
网状模型的存储需要存储数据本身和数据间的联系,常用的方法有:单向链接、双向链接、环状链接、向首链接
如下图,是一个学生选课系统的网状数据库实例,其中,左侧为学生记录,右侧为课程记录,中间为选课记录
【关于格式化模型】
实质上,层次模型可以认为是网状模型的一种特例,因此两者被统称为格式化模型
两者有许多共同的缺点:
- 使用了许多与数据操作任务无关的概念,如:DBTG 系统中的系
- 记录之间的联系是通过存取路径实现的,在访问数据时必须选择适当的存取路径,这要求必须了解系统结构的细节,加重了编写应用程序的负担
- 不支持集合处理,即未提供一次处理多个记录的功能
- 没有充分认识端点用户直接与数据库对话的需求,缺乏为适应非预期查询而增加系统设施的能力