1.0 简介 (introduction)
本文对怎样使用xml和数据库做了总体回顾,描述了以数据为中心和以文档文中心的文档的差异如何影响到在数据库中的应用,xml和关系型数据库的一般用法,以及什么是原生xml数据库和何时使用它。
2.0 xml是数据库吗?(is xml a database?)
在开始讨论xml和数据库之前,我们先回答许多人提过的问题:“xml是数据库吗?”
如果仅按数据库这个术语的本质来看,xml文件是数据库。即它是数据的集合。在许多方面看起来它和其他文件没什么区别 -- 无论如何,每个文件都含有某种类型的数据。作为一种“数据库”格式,xml有一些优势:例如,它是自描述的(所用的标记描述了数据的结构和类型,尽管缺乏语义),可交换的(portable)(unicode),能够以树型或图形结构描述数据。同样它也有缺点,例如,它是冗余的,由于要对它进行解析和文本转换,所以数据访问速度较慢。
一个更有用的问题就是在宽松的意义上,xml及其周边技术是否可以算作“数据库” -- 即数据库管理系统(dbms)。答案是“在某种程度上是(sort of)”。从正面来说,xml提供了许多数据库所具备的东西:存储(xml文档), 模式(dtd, xml schema语言), 查询语言(xquery, xpath, xql, xml-ql, quilt等等),编程接口(sax, dom, jdom)等等。从反面来说,它缺少一些真正的数据库所应具备的东西:高效的存储,索引,安全,事务和数据一致性,多用户访问,触发器,在多个文件中查询等等。
xml适合于用作所谓“数据库”的一个好例子就是 .ini文件 -- 它包含应用程序的配置信息。与其写一个处理以逗号分隔(comma-delimited)的文件的解析器,开发一种小型的xml语言并写一个解释它的sax程序要容易的多。此外,xml允许使用嵌套的实体,而逗号分隔的文件(comma-delimited files)很难做到这点。然而,说它就是数据库还很勉强,因为它是线性读写的,而且仅用在程序开始和结束时。
比较适合于xml数据库的一些复杂的数据集就是个人通讯录(名字,电话号码,地址等),或用于描述浏览器书签以及用napster偷来的mp3。然而,由于dbase和access之类的数据库物美价廉,即使在这种情况下似乎也没有多少理由把xml文件作为数据库使用。xml的唯一真正好处就是数据的可交换性(portable),由于有越来越多的工具可以用来将数据库当作xml进行存取,这一点好处似乎也要打些折扣。
3.0 为什么要用数据库?(why use a database?)
当你开始考虑xml和数据库的时候首先要回答这个问题:为什么你会先想到使用数据库?你是否想利用现有数据?是否想找个地方存储web页面? 是否在电子商务中使用数据库,而xml在其中作为数据传输载体? 对这些问题的回答将会极大地影响你对数据库和中间件(如果有的话)的选择, 以及如何使用数据库。
例如,你有个电子商务的应用,将xml用作数据交换。那么你的数据最好有个高度规整的结构并且供非xml程序使用。还有,xml文档所用的某些东西如实体和编码对你来说可能并不重要 -- 总之,你感兴趣的是数据,而不是它在xml内如何存储。在这种情况下,你大概需要一个关系型数据库以及在xml和数据库之间转换数据的软件。如果你的应用程序是面向对象的,你甚至还需要一个在数据库或xml中存取这些对象的系统。
另一方面,假如你要从一些面向散文(prose-oriented)的xml文档建立一个网站。你不但要管理这个网站,还要提供一个途径让用户可以查找内容。你的文档看起来结构比较松散,其中的实体的使用对你来说可能更重要,因为它们是文档结构的重要部分。这种情况下,你也许需要一个原生xml数据库(native xml database)或内容管理系统(content management system)。这就使你可以保持文档的物理结构,支持文件级的事务处理,以及使用xml query语言进行查询。
4.0 数据和文档 (data versus documents)
在选择数据库时最重要因素大概就是你想在数据库存储数据还是文档。例如,是简单地把xml当作数据库和(可能不支持xml)应用程序之间的数据转换工具,还是用于集成,就像xhtml和docbook中的那样?通常这是个偏好,但是却非常重要,因为所有以数据为中心的(data-centric)文档有着许多相同的特性,所有以文档为中心的(document-centric)也有许多相同的特性。这会影响到xml在数据库中如何存储。下面两部分中我们就来考察这些特性。
(历史背景:我在xml-dev邮件列表上第一次听说data-centric和document-centric这些术语,不知道是谁发明的,但是我在1997的消息中发现有使用document-centric的,从1998年以后这两个术语都有使用。)
4.1 以数据为中心的文档 (data-centric documents)
以数据为中心的文档就是将xml用作数据的传输载体,专门提供给机器消费,其实没有必要全部采用xml。也就是说,对于应用程序或数据库而言,(在某个时间段内)数据是否以xml文档的形式存储并不重要。以数据为中心的文档的例子有销售订单、航班时刻表、科研数据及股市汇率。
以数据为中心的文档的特点是结构相当规整,数据粒度精细(fine-grained data)(即最小的独立数据单位只存在于pcdata元素或属性级别),很少或没有混合内容。除非在对文档进行验证的时候,同级元素或pcdata的出现次序一般来说并不重要。
以数据为中心的文档中的这类数据可以来自数据库(此时要输入给xml)或在数据库之外(此时要将其存入数据库)。前者的一个例子就是关系数据库现存的大量数据;而从测量系统采集并转化为xml的科研数据就是后者的例子。
例如,下面的销售订单就是以数据为中心的:
<salesorder sonumber="12345">
<customer custnumber="543">
<custname>abc industries</custname>
<street>123 main st.</street>
<city>chicago</city>
<state>il</state>
<postcode>60609</postcode>
</customer>
<orderdate>981215</orderdate>
<item itemnumber="1">
<part partnumber="123">
<description>
<p><b>turkey wrench:</b><br />
stainless steel, one-piece construction,
lifetime guarantee.</p>
</description>
<price>9.95</price>
</part>
<quantity>10</quantity>
</item>
<item itemnumber="2">
<part partnumber="456">
<description>
<p><b>stuffing separator:<b><br />
aluminum, one-year guarantee.</p>
</description>
<price>13.27</price>
</part>
<quantity>5</quantity>
</item>
</salesorder>
除了像销售订单这种显而易见的以数据为中心的文档之外,许多以文本为主的(prose-rich)文档也可以是以数据为中心的。例如,amazon.com用来显示书籍信息的一个页面。尽管页面上大部分内容都是文本,这些文本的结构是非常规则的,许多都和其它书籍的描述相同,每个页面特有的文本并不很多。这样,就可以从数据库中取出书籍的相关资料,转换为简单的、以数据为中心的xml文档,再用xsl样式表生成页面。一般来说,那些用数据库中的数据填充模板,动态生成html文件的网站都可以转而使用一系列以数据为中心的xml文档和xsl样式表。
例如,下面是个描述航班信息的文档:
<flightinfo>
<airline>abc airways</airline> provides <count>three</count>
non-stop flights daily from <origin>dallas</origin> to
<destination>fort worth</destination>. departure times are
<departure>09:15</departure>, <departure>11:15</departure>,
and <departure>13:15</departure>. arrival times