层次模型查看源代码讨论查看历史
层次模型 | |
---|---|
层次模型,在数据库中定义满足:(1)有且只有一个结点没有双亲结点,这个结点称为根结点;(2)根以外的其他结点有且只有一个双亲结点两个条件的记录以及它们之间联系的集合为层次模型 。它的基本逻辑结构可以用一棵倒置的树表示 。层次数据模型中最基本的数据关系是基本层次关系,它代表两条记录之间一对多(包括一对一)的联系 。数据库中有且仅有一条记录无双亲,称为根结点,其他记录有且仅有一个双亲 。层次模型是最早用于商用数据库管理系统的数据模型 。
现实世界中许多实体之间的联系本来就呈现出一种很自然的层次关系,如行政关系、家族关系等 。用层次模型对具有一对多的层次联系的部门描述非常自然、直观,容易理解,这是层次数据库的突出优点 。[1]
基本信息
中文名称 层次模型 [2]
外文名称 Hierarchical Model
逻辑结构 树形结构
适用范围 一对多联系
存储结构 邻接法、链接法
应用溯源
层次模型诞生于20世纪60年代,主要用于复杂制造项目的大量数据管理,如1969年阿波罗火箭登录月球 。层次模型是数据库系统中最早出现的数据模型,层次数据库系统采用层次模型作为数据的组织方式 。层次数据库的典型代表是IBM公司的IMS(Information Management System),这是1968年IBM公司推出的第一个大型商用数据库管理系统,曾经得到广泛的使用 。
定义
在数据库中定义满足下面两个条件的记录以及它们之间联系的集合为层次模型:(1)有且只有一个结点没有双亲结点,这个结点称为根结点;(2)根以外的其他结点有且只有一个双亲结点 。
相关概念
在层次模型中,每个结点表示一个记录类型,记录类型之间的联系用结点之间的连线(有向边)表示,这种联系是父子之间的一对多的联系。这就使得层次数据库系统只能处理一对多的实体联系 。
每个记录类型可包含若干个字段,这里记录类型描述的是实体,字段描述实体的属性。每个记录类型及其字段都必须命名。各个记录类型、同一记录类型中各个字段不能同名。每个记录类型可以定义一个排序字段,也称码字段,如果定义该排序字段的值是唯一的,则它能唯一地标识一个记录值 。
一个层次模型在理论上可以包含任意有限个记录类型和字段,但任何实际的系统都会因为存储容量或实现复杂度而限制层次模型中包含的记录类型个数和字段个数 。
在层次模型中,同一双亲的子女结点称为兄弟结点,没有子女结点的结点称为叶结点 。
特征
层次模型的一个基本的特点是,任何一个给定的记录值只能按其层次路径查看,没有一个子女记录值能够脱离双亲记录值而独立存在 。
举例
下面是一个教员学生层次模型。该层次模型有4个记录类型 。分别是:
(1)记录类型"系"是根结点,由系编号、系名、办公地点3个字段组成。它有两个子女结点"教研室"和"学生" 。
(2)记录类型"教研室"是"系"的子结点,同时又是"教员"的双亲结点。它由教研室编号和教研室名两个字段组成 。
(3)记录类型"学生"由学号、姓名、成绩3个字段组成 。
(4)记录类型"教员"由职工号、姓名、研究方向3个字段组成 。
"学生"与"教员"是叶结点,他们没有子女结点。由"系"到"教研室"、"教研室"到"教员"、"系"到"学生"都是一对多的联系 。
数据操纵和完整性约束
层次模型的数据操纵主要有查询、插入、删除和更新。进行插入、删除、更新操作时要满足层次模型的完整性约束条件 。具体如下:
(1)进行插入操作时,如果没有相应的双亲结点值就不能插入它的子女结点值。例如,在上例的层次数据库中,如果新调入一名教员,但尚未分配到某个教研室,这时就不能将新教员插入到数据库中 。
(2)进行删除操作时,如果删除双亲结点值,则相应的子女结点值也被同时删除。例如,在上例的层次数据库中,如果删除网络教研室,则该教研室所有教员的数据将全部丢失 。
(3)进行更新操作时, 应更新所有相应记录,以保证数据的一致性 。
存储结构
层次模型数据的存储常常是和数据之间联系的存储结合在一起的 。常用的实现方法有两种:
(1)邻接法
按照层次树前序遍历的顺序把所有记录值依次邻接存放,即通过物理空间的位置相邻来实现层次顺序 。
(2)链接法
用指针来反映数据之间的层次联系 。
优缺点
优点
层次模型的优点主要有:
(1)层次模型的数据结构比较简单清晰 。
(2)层次数据库查询效率高。因为层次模型中记录之间的联系用有向边表示,这种联系在数据库管理系统中常常用指针来实现。因此这种联系也就是记录之间的存取路径。当要存取某个结点的记录值,数据库管理系统就沿着这一条路径很快找到该记录值,所以层次数据库的性能优于关系数据库, 不低于网状数据库 。
(3)层次数据模型提供了良好的完整性支持 。
缺点
层次模型的缺点主要有:
(1)现实世界中很多联系是非层次性的,如结点之间具有多对多联系,不适合用层次模型表示 。
(2)如果一个结点具有多个双亲结点等,用层次模型表示这类联系就很笨拙,只能通过引入冗余数据(易产生不一致性)或创建非自然的数据结构(引入虚拟结点)来解决 。
(3)对数据的插入和删除操作的限制比较多,因此应用程序的编写比较复杂 。
(4)查询子女结点必须通过双亲结点 。
(5)由于结构严密,层次命令趋于程序化 。