数据模型之逻辑模型5
上次随笔主要是关于概念模型的问题,这一次学习一下逻辑模型的知识。 在数据库领域中主要要有两种常用的逻辑模型,一种是非关系模型,一种是关系模型。其中属于前者的是层次模型和网状模型,属于后者的是关系模型、面向对象模型和对象关系模型。
非关系模型的数据库在数据库刚刚兴起的年代也就是70年代到80年代初这一段时期比较流行,占主导地位。现在也已经逐渐被关系模型的数据库系统产品取代。
层次模型是出现较早的一种公认的数据库管理系统数据模型。它是将数据组织成有向有序的树结构,并用“一对多”的关系联结不同层次的数据库。早在1968年IBM 公司就推出了IMS 的最初版本,之后,层次数据库管理系统得到了迅速发展,同时它也影响了其它类型的数据库管理系统,特别是网状系统的出现和发展。
网状数据库是处理以记录类型为结点的网状数据模型的数据库。处理方法是将网状结构分解成若干棵二级树结构,称为系。系类型是二个或二个以上的记录类型之间联系的一种描述。在一个系类型中,有一个记录类型处于主导地位,称为系主记录类型,其它称为成员记录类型。系主和成员之间的联系是一对多的联系。网状数据库的代表是DBTG 系统。1969年美国的CODASYL 组织提出了一份“DBTG 报告”,后来根据DBTG 报告实现的系统一般称 为DBTG 系统。现有的网状数据库系统大都是采用DBTG 方案的。DBTG 系统是典型的三级结构体系:子模式、模式、存储模式。
在随笔(1)提到过,在1970年IBM 的研究员“关系数据库之父”埃德加·弗兰克·科德博士在刊物 《Communication of the ACM》上发表了题为“大型共享数据库的关系模型”的论文,首次提出了数据库的关系模型的概念,奠定了关系模型的理论基础。后来Codd 又陆续发表多篇文章,论述了范式理论和衡量关系系统的12条标准,用数学理论奠定了关系数据库的基础。IBM 的Ray Boyce和Don Chamberlin将Codd 关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL 语言。由于关系模型具有坚实的数学理论基础,所以一经推出就受到了学术界和产业界的高度重视和广泛响应,并很快成为数据库市场的主流。20世纪80年代以来,计算机厂商推出的数据库管理系统几乎都支持关系模型,数据库领域当前的研究工作大都以关系模型为基础。
数据库系统本质上的区别就在于支持的数据模型不同。到底这三种模型有什么不同?我带着这个疑问去查找了很多资料。
层次数据库系统是出现的最早的数据库产品,其支持的层次模型用树形结构表示各类实体以及实体间的联系。关于实体间的联系主要有三种,一对一联系、一对多联系和多对多联系,接下来研究一下基于层次模型的数据库是怎样表示这
三种联系的。要解决这个问题,还得从数据模型三要素入手。
层次模型如何表示实体间的联系主要靠的就是树形的数据结构。在这,跳出数据库范围去查找了一下树的定义。在数据结构课程中,树是这样定义的:是一种数据结构,它是由n (n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
(1)每个结点有零或多个子结点;(2)没有前驱的结点称为根结点;(3)每一个非根结点有且只有一个父结点;(4)除了根结点外,每个子结点可以分为m 个不相交的子树。
在层次模型树结构中,每个结点表示一个记录类型。记录之间的联系用结点之间的连线(有向边)表示,这表示父子之间的一对多的联系,当然,一对一的情况也就包含其中了。记录类型描述的是实体,而记录类型包含若干个字段,字段描述的就是实体的属性,都必须有不同的名字。记录类型可以定义排序字段,也就是标识字段,当且仅当码值唯一时可标识区分一个记录值。根据树的定义,任何一个给定的记录值只有按其路径查看时,才能看清其全部意义,没有无父亲记录值的子女记录值。
到此,我比较好奇是怎样实现层次模型的,这里我找到了一个教员学生层次数据库模型
并将此模型某一时刻对应的实体集之间的层次关系给出,如下图:
上面的两张图让我想起了数据结构中的链表,每个结点由链表构成,相邻结点由指针链接次序实现。层次数据库物理层次估计就是这样实现的吧。这与后来知道的层次数据模型的存储结构的实现方法不谋而合。其实现方法主要有两种:一种是邻接法,按照层次树前序穿越的顺序将所有记录值依次邻接存放,通过物理空间位置相邻体现层次关系;一种是链接法,用指针反映数据之间的层次联系。这两种方法在数据结构一书中均有学习,此处就不再细究。
来看一下层次模型怎样表示多对多的联系。在前面的随笔中提到过,多对多的联系可以分解为一对多的联系来理解,层次模型表示多对多联系就是这样做的。主要有两种方法,一种是冗余结点法,一种是虚拟结点法。
先来看一例多对多的联系:
采用冗余结点分解方法:
采用虚拟节点分解方法:
层次模型表示多对多关系尚且这么复杂,而在现实生活中有很多事物的关系是非层次的关系,再用层次模型表示会变的更加繁杂,而网状模型却可以很好的解决这些问题。在基本层次联系满足以下两个条件后,就可以称为网状模型:
(1)允许一个以上的结点无双亲;
(2)一个结点可以有多于一个的双亲。
其实这种模型和数据结构中的图差不多。从以上两点可以看出,层次模型和网状模型的区别在于:前者子女结点与双亲结点的联系是唯一的,而后者这种联系不唯一。来看一个网状数据模型:
从上图可以看出网状数据库组织数据的方式。常用的方法是链接法、指引元阵列法、二进制阵列法和索引法等。因为涉及到复杂的链表实现,不再细究。
关系模型是目前最重要的一种数据模型,它与层次模型和网状模型不同,是建立在严格的数学概念的基础上。在这只列出一些术语,至于详细的了解,到了学习关系数据库的时候再详细讨论。基本的术语主要有关系、元组、属性、码、域、关系模式的歌,其实这些在前面也都介绍过了,不再重复。只不过关系模式好像没见过,但是见过实体型这个概念,其实两个概念差不多,至少我是这样认为。
介绍完主要的数据库模型,至于其它的数据模型,由于手中的资料较少,大部分资料来源于网络,在下一次随笔中再分享给大家。