引言
现实世界中大量的数据都具有层次结构,常见的例子包括组织机构序列(如公司机构、部队编制、作战编成)、分类体系(如中图分类法、装备体系)、家族谱系等等。因此,层次结构数据的管理,在软件开发过程当中经常会遇到,是个具有共性的问题。
数据管理是指如何对数据进行分类、组织、编码、存储、检索、控制和维护,是数据处理的中心问题。关系数据库管理系统通过索引、查询优化、事务处理、并发访问控制、触发器、错误恢复等强大的机制,有效地确保了海量数据存取的高效性,保证了数据的完整性和一致性,并提供了数据的可靠性和安全性,从而具有其它数据管理方式无法比拟的优势。因此,在企业计算的环境下,对于数据管理,尤其是对于大规模商业数据的管理,关系数据库占据着主导地位。当前,大量的大型信息系统都是建立在关系数据库平台之上的。然而,在管理层次结构的数据,以及日益普遍的半结构化、非结构化数据方面,关系模型也暴露出了一些固有的不足。
关系模型在管理层次结构数据上的不足
关系数据库的理论基础是关系理论,它的数据模型是关系模型。在用户看来,一个关系模型的逻辑结构是一张规则的二维表,由行和列组成。随着新的计算机技术的不断涌现,以及数据的分布性、异构性和半结构化特性以及非结构化特性程度的不断加强,关系数据库系统在数据管理上也已经显示出了一些不足:
现实世界被强制性地映射成为一系列表的集合(即一组二维关系),因此,复杂对象的许多语义,例如,聚合和特化,均被丢弃。
对于现实世界中数据具有的次序语义,必须通过关系表当中额外的附加字段进行描述,以能够索引同属元素的次序(在关系数据库的记录集中,记录的次序是没有意义的。当然,次序没有意义是关系理论所要求的。这样,通过建立索引,搜索记录就变得更为容易,在性能上得到了优化)。并且,要维护这种次序语义也是比较麻烦的。
类似地,对于现实世界中数据具有的层次结构(如父/子、祖先/后代等层次结构),也必须通过关系表当中额外的附加字段进行描述。实际上,也可以把层次结构当作是一种特殊的次序语义。
关系模型要求关系必须是规范化的。为了提高关系模型的规范化程度(目前的最高层次为第五范式),以降低数据冗余度和避免数据的更新(包括插入、修改和删除)异常,必须在设计时(design-time)人为进行关系的分割(即规范化设计);在运行时(run-time)再进行连接(join)。这就增加了系统设计的难度,而且会影响系统的运行性能,这是因为,连接是关系数据库当中最为耗时的操作。因此,需要在数据库的设计时性能和运行时性能之间取得平衡。
一旦数据库模式发生变化,可能需要重新编写接口程序。
每条记录包含固定数目的字段,每个字段占据定长的存储空间。这样在存储叙述性资料时,会浪费空间。此外,
数据库的结构应该具有相对的稳定性,不太容易被改变,数据库结构上的改变(即数据库的重构造,不同于数据库的重组织)可能导致极其高昂的代价,即可扩展性较差。这也在一定程度上说明了为什么数据库的分析和设计具有如此重要作用的原因。这同 XML 在结构上具有的柔性形成了鲜明的对比。
为此,有必要探讨数据管理的新思路和新方法。XML 所具有的一些独特的优点和功能,使得它在层次结构数据的管理方面崭露头角,并已经引起了多方广泛的关注。
应用 XML 管理层次结构的数据
应用 XML 管理层次结构的数据有几个显著的优点:便于构建并维护数据的树状结构;便于保持数据的次序语义;以及便于与开发平台的树状控件相结合等。
XML 数据模型的特点
XML 是 W3C 制定的标准,被设计为混合语(lingua franca),以便在用户和程序之间交换信息。它具有一系列优良特性,如可扩展性,简单性,自描述性,结构、内容和表现分开等。因此,XML 在自由软件以及商业软件业界均获得了强有力的支持,从而能够为开发人员提供极大的灵活性。
从数据建模方面来看,XML 提供了两种手段:DTD 和 XML Schema。它们可以使开发人员将他们的思想具体化,为成组具有相同逻辑结构的文档(而不仅仅是单个文档)制定规范。正是通过这两种建模手段,XML 承诺帮助创建更加智能的文档,如提供某种程度的查错功能,易于从中提取出有用的信息,并将它们按照人们的需要展示出来。
XML 数据模型的优点
XML数据模型本身就是树状模型,一篇格式良好(well-formed)且有效的(validated)XML 文档经过 DOM 解析之后,就会在内存当中建立一棵树。因此,对于现实世界中数据具有的次序语义和层次结构,XML 数据模型能够很好且方便地由XML文档解析器予以保持,开发人员不必费什么力气。并且,这种次序语义和层次结构的动态维护也是比较简单的。
此外,XML 解析器是组件,具有标准的接口,开发人员从而可以避免接口程序的重复开发和分发,以及降低相应的接口程序测试和维护开销。
XML 与树状控件的结合
XML 是国际标准,树状控件是常用而重要的界面元素,两者在业界均获得了广泛支持;而且,如前所述,XML 数据模型本身就是树状模型,这种结构上的内在相似性,使得两者具有天然的良好的结合性。
由于在软件开发过程当中经常会遇到层次结构数据的管理,为避免重复劳动和避免重新开发可能引入的错误,从而提高软件开发的效率和质量,削减开发费用和缩短开发周期,笔者利用组件技术,将XML与树状控件相结合,综合应用 OLE、用户自绘制等技术,开发了一个组件,在组织机构编码系统、任务空间概念模型(CMMS)管理系统等多个项目当中得到了复用,取得了预期效果。
该组件具有如下特点和功能:
便于构建树状结构,同时保持数据的次序语义和层次结构
数据源是 XML 文档。
可在 IE 当中快捷地判断数据的次序语义和层次结构是否符合要求。
如果组件加载 XML 文档成功,应用程序便用树状控件显示树状结构;否则,给出错误提示,便于用户修改。
支持持久化(Persistence),将用户的修改回存到 XML 文档当中。
以图形化方式,直观地维护层次结构
增加节点,可在指定位置增加子节点或者兄弟节点
删除节点。
修改节点。
节点的快速查找和定位。
与 OLE 紧密结合
修改项目时,支持在位编辑(in-place edit)。
修改项目时,支持对特定字符的过滤。
支持以拖-放(drag & drop)方式,在树之间或者树自身完成节点的复制操作或者移动操作。
节点的编码是树状结构与关系数据库结合的关键,为此,该组件提供了十分灵活的编码方式
节点的编码采用可打印字符形式。
编码的长度可任意扩展,允许树有足够的高度(树中各节点的最大层次数目)。
每位码的取值范围大约为100,允许树有足够的度(树中各节点拥有的最大子树数目)。
采用用户自绘制(custom draw)方式,使得树状控件具有强大的表现功能
可直观地调整节点的字体和字号。
可直观地为每个节点设置不同的颜色。
可打印输出树状结构。
示例
为清晰起见,清单1给出了 A 银行组织机构序列的示例数据(XML 文档格式):
清单1. A 银行组织机构序列示例(XML 文档格式)
<?xml version='1.0' encoding='GB2312' standalone='yes'?>
<A银行总部>S
<B1省分行>SA
<C1县支行>SAA
<D1镇分理处>SAAA
<E1村储蓄所>SAAAA
</E1村储蓄所>
<E2村储蓄所>SAAAB
</E2村储蓄所>
<E3村储蓄所>SAAAC
</E3村储蓄所>
</D1镇分理处>
<D2镇分理处>SAAB
</D2镇分理处>
</C1县支行>
<C2县支行>SAB
</C2县支行>
</B1省分行>
<B2省分行>SB</B2省分行>
<B3省分行>SC</B3省分行>
<B4省分行>SD</B4省分行>
<B5省分行>SE</B5省分行>
</A银行总部>
作为对比,清单2给出了 A 银行组织机构序列的示例数据(关系模型数据格式),由此不难发现 XML 文档格式管理层次结构数据的优越性:
清单2. A银行组织机构序列示例(关系模型数据格式)
请注意,上表当中的"是否叶子节点"、"层次"、"上一级编码"、"上二级编码"、"上三级编码"、"上四级编码"等字段均是为了描述数据的层次结构而附加的;同时,上表当中还不得不引入大量的空值(null)。
A 银行组织机构序列在该组件中的一种表现效果如下图所示:
XML 与关系数据库的结合
由上述讨论可知,应用 XML 进行数据管理具有特殊的优势,可以有效地弥补关系数据库在层次结构数据的管理上的不足和存在的问题,有着十分广阔的前景。
当然,这个解决方案并不是完美无缺的,存在以下几个问题。首先,XML 中所有的数据都以字符串进行存储。这样在文档当中搜索或者在必须进行数据类型转换的时候,可能带来额外的时间开销。当数据规模比较大、或者应用程序对时间的要求比较苛刻时,开发人员必须对这种额外的时间开销给以足够的重视。而解决这个问题的唯一途径就是,建立一个典型的应用程序,并对它进行强度测试(stress test)。其次,XML 文档在给人们带来易读性的同时,也具有潜在的安全性隐患。另外,XML 的许多相关标准和技术,还处于草案阶段,没有最终定型,不同技术厂商之间的利益纷争也可能带来比较严重的问题。
因此,一个自然的想法就是将 XML 与关系数据库结合在一起,以发挥各自的长处,扬长避短。具体来说,就是用 XML 管理小规模的层次结构的数据,而用关系数据库管理大规模的商业数据,两者通过树的节点的编码进行连接。
例如,在组织机构编码系统提供的组织机构序列的基础上,可进一步利用关系数据库技术完成组织机构的信息采集、查询、统计、维护等功能。
小结
应用 XML 进行数据管理具有特殊的优势,可以有效地弥补关系数据库在层次结构数据的管理上的不足和存在的问题。但是,XML 技术和关系数据库技术之间并不是相互竞争、相互排挤的关系,而是相互补充和相互促进的关系。实际上,XML 和关系数据库具有很强的互补性,它们好像就是为在一起协作而设计的,将长期共存下去。一个综合的数据管理系统几乎都是需要同时使用 XML 和关系数据库。一个好消息是,几乎所有主要的关系数据库产品都提供了对 XML 的支持。
参考资料
王珊等编写的数据库教程"数据库系统原理教程"详细论述了关系数据库在数据管理上的特点和优点,并且着重分析了关系模型在管理层次结构的数据以及日益普遍的半结构化、非结构化数据方面暴露出来的不足。
徐享忠等撰写的论文"XML 在数据管理上的应用"详细论述了 XML 在数据管理上的可能应用,包括数据的基本存储、数据的归档和备份、中间数据交换格式、数据挖掘和数据表现等多个方面。
基于 XML 的数据交换在仿真系统中的应用,可参见徐享忠等撰写的论文"基于XML 的数据交换格式在先进分布仿真系统中的应用"。
XML 的特点、语法规则、组成部分及业界应用实例,可参见Simon St. Laurent编写的"XML A Primer (2nd Edition)"。
Michael Morrison著的"XML Unleashed"详细介绍了在各种开发平台(尤其是c++)上,利用组件技术访问XML各个组成部分(如SAX、DOM、XSLT)的方法。
E.J.Lu等撰写的论文"An Empirical Study of XML/EDI"详细阐述了企业,特别是中小型企业在电子数据交换系统当中采用XML作为解决方案可能带来的机遇和巨大的好处,以及可能存在的一些隐患。
关于作者
徐享忠是一名软件工程师和仿真系统开发人员,他编写有关关系数据库、仿真数据可视化方面软件开发、系统建模与仿真方面的文章。他曾使用汇编、C/C++、Matlab、Fortran和各种Web工具进行广泛的编程。可通过 xuxz02@21cn.com与他联系。