目录1.0 简介 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 are minutes later. </FlightInfo>从下面的XML文件和一个简单的样式表中创建这个文档: <Flights> <Airline>ABC Airways</Airline> <Origin>Dallas</Origin> <Destination>Fort Worth</Destination> <Flight> <Departure>09:15</Departure> <Arrival>09:16</Arrival> </Flight> <Flight> <Departure>11:15</Departure> <Arrival>11:16</Arrival> </Flight> <Flight> <Departure>13:15</Departure> <Arrival>13:16</Arrival> </Flight> </Flights> 4.2 以文档为中心的文档 (Document-Centric Documents)以文档为中心的文档通常是供人消费的。例如书籍、email、广告以及几乎所有人工写成的XHTML文件。其特性为结构不太或根本不规则、数据粒度大(larger grained data)(最小的独立数据单位可能存在于包含混合内容的元素甚至整个文档本身),混合内容多。同级元素或PCDATA出现的次序一般来说总是非常重要的。 以文档为中心的文档通常是以XML手工写成,或从其他格式(如RTF, PDF, SGML)转换到XML,与以数据为中心的文档不同,它们通常不来源于数据库。(由插入到模板中的数据得到的文档是以数据为中心的;更多信息请看4.1节末尾部分)。将各种格式转换为XML的软件信息,请参阅XML软件相关链接。 例如,下面这个产品说明是以文档为中心的: <Product> <Intro> The <ProductName>Turkey Wrench</ProductName> from <Developer>Full Fabrication Labs, Inc.</Developer> is <Summary>like a monkey wrench, but not as big.</Summary> </Intro> <Description> <Para>The turkey wrench, which comes in <i>both right- and left- handed versions (skyhook optional)</i>, is made of the <b>finest stainless steel</b>. The Readi-grip rubberized handle quickly adapts to your hands, even in the greasiest situations. Adjustment is possible through a variety of custom dials.</Para> <Para>You can:</Para> <List> <Item><Link URL="Order.html">Order your own turkey wrench</Link></Item> <Item><Link URL="Wrenches.htm">Read more about wrenches</Link></Item> <Item><Link URL="Catalog.zip">Download the catalog</Link></Item> </List> <Para>The turkey wrench costs <b>just $19.99</b> and, if you order now, comes with a <b>hand-crafted shrimp hammer</b> as a bonus gift.</Para> </Description> </Product> 4.3 数据、文档和数据库(Data, Documents, and Databases)实际上,以数据为中心和以文档为中心的文档之间的差别不一定很明显。例如,另一种以数据为中心的文档比如发票,可能含有大粒度的、非结构化的数据比如零件说明;另一种以文档文中心的文件如用户手册,可能包含细粒度的结构规则的数据(通常为元数据)比如作者和修订日期。其它例子包括法律和医学文书,虽然以散文的形式写成但是却包含离散的数据块例如日期、名称和操作程序,出于法定原因通常要以完整的文件形式存储。 除此之外,弄清文件的这两种特点有助于选择数据库的类型。一般来说,将数据存储于传统的数据库,例如关系型,面向对象型或层次型数据库。这可由第三方的中间件完成或由数据库本身提供内在支持。对于后者,该数据库被称作支持XML的(XML-enabled)。文档可被存储在原生(native)XML数据库(专为存储XML而设计的数据库)或内容管理系统(建在原生XML数据库之上专门用来管理文档的程序)。 这些原则并不是绝对的。如果对XML特有的功能不很看重,数据,特别是半结构化的数据可以存储在原生XML数据库,文档也可以存储到传统数据库。何况传统数据库与原生XML数据库之间的界限越来越模糊,传统数据库增加了原生XML的能力,而原生XML数据库增加了对文档存储在外部(通常为关系型)数据库的支持。 本文剩下的部分就有关数据(第5节)和文档(第6节)的存储和读取的策略与问题展开讨论。关于最新的XML数据库产品,请见 XML Database Products。 5.0 数据的存取(Storing and Retrieving Data)为了在XML文件和数据库之间交换数据,有必要将XML文件的schema(DTD,XML Schema, RELAX NG等)映射到数据库的schema。用于数据转换的软件就建在这种映射之上。该软件可以使用XML Query语言(如XPath,XQuery,或其他专用语言)或简单地按照映射(SELECT * FROM Table的XML对等式)转换数据。对于后者,文档的结构必须完全符合映射所要求的结构。由于通常不易做到这点,使用这种策略的产品一般要和XSLT一起使用。在数据转换到数据库之前,先将文件按照映射所要求的结构进行转换,然后转存数据。相应地,数据从数据库中取出以后,结果文件要被转换成应用程序所需的结构。 5.1 映射[XML]文件Schema到数据库Schema (Mapping Document Schemas to Database Schemas)文件schema到数据库schema的映射是在元素类型、属性和文本上进行的。这时几乎总是忽略物理结构(例如实体、CDATA部分及编码信息)及某些逻辑结构(如处理指令、注释以及元素和PCDATA在父元素内出现的顺序)。这样比完全照搬更为合理,因为数据库和应用程序只需关心XML文件中的数据。例如,在上述的销售订单中,客户代号是在CDATA部分,还是外部实体中,或直接就是PCDATA并不重要,同样,客户代号出现在订货日期之前或之后也无关紧要。 这种方法的一个后果是能否保证文件有“往返车票” -- 将文件中的数据存入数据库后,又从数据库中的数据建立文件,而这个文件往往和原来的文件不同(哪怕从最一般的意义上讲)。在选择软件是要考虑到是不是允许这种情形发生。 将一个XML文件的schema映射到数据库的schema有两种方法:基于表格的映射和对象-关系映射。 5.1.1 基于表格的映射 (Table-Based Mapping)许多转换XML到数据库的中间软件都采用基于表格的映射。它把XML文件看作一个(或一组)表格,也就是说,XML文件的结构必须是下面这种样子,如果只是单一表格的话,就不再需要<database>元素和其他<table>元素: |
XML与数据库
最新推荐文章于 2017-08-04 22:01:22 发布
作者Blog:
http://blog.csdn.net/myali88/