首页 运维 正文
基于XML的数据库总体分析(上)

 2022-10-23    363  

为什么要把XML数据库相联系呢?举个例子来说明这个问题,比如你有一个电子商务的应用程序需要使用XML来进行数据传输。你所关心的是数据本身应该具有的结构,你并不关心它在文档中实际的存储结构。如果你的应用程序很简单的话,基本的文件系统将满足你的需求,但如果应用本身很复杂的话,你就需要一个完整的开发应用环境来支持XML。从另一个方面来说,假设你有一个Web站点,它的内容是由一系列XML文档构成的,你不仅要管理这个站点,同时你需要提供给用户一个搜索该站点内容的机制。而这些都需要借助数据库来实现。

选择一个数据库的最重要的因素是你是否需要数据库来存储数据或者是文档,如果你想要存储数据的话,你需要一个关系数据库或者是对象数据库来存储实际的数据,同时你需要中间件在数据库和XML文档之间建立桥梁关系,从另一方面来说,如果你想要存储文档,你需要一个内容管理系统,通过它进行文档的存储。实际上,XML文档可以分到两大类:以数据为中心或者以文档为中心。

以数据为中心的文档:数据为中心的文档有非常规则的结果,比如关于销售订单或者是饭店菜单的XML文档。以数据为中心的文档通常是为机器设计的,也就是说主要是方便机器进行处理。通常,任何Web站点可以动态的构建HTML文档,其步骤如下,根据用户的查询请求找到相关的面向数据的XML文档,然后通过XSL对XML文档进行转化,让基于HTML的浏览器能够方便的浏览结果。

以文档为中心的文档:以文档为中心的文档具有不规则的结构,而且数据的粒度也比较大。具体的例子如书本、电子邮件、广告等等。以文档为中心的文档主要是用人类而设计的。

为了存储或提取数据,你可以使用数据库和中间件,或者你可以使用XML服务器,或者是基于XML的Web服务器。为了存储文档,你需要一个内容管理系统或者是可持久化的DOM实现。可以在数据库或者是XML文档中发现大量基于数据为中心的文档。这样我们就需要工具把数据从数据库转化成XML文档,或者把一个XML文档转换到数据库中。同时需要注意的是,当把数据存储到数据库中的时候,需要抛弃一个文档的很多信息,比如它的名称和DTD,它的物理结构,比如实体定义和使用,一个节点下元素的位置排列,二进制数据的存储方式等等。同样,当从数据库中提取数据的时候,产生的XML文档通常不包含CDATA或者是实体使用的说明,而且节点下元素的排列位置只和数据库中记录的顺序位置一致。实际上一个XML文档存储到数据库中,再由该数据库生成此XML文档,这前后两个文档格式几乎不可能完全一样。

为了在数据库和XML文档之间传递数据,必须在文档结构和数据库结构之间建立映射,这种映射可以有两个分类:模板驱动和模型驱动。

1.基于模板驱动的映射:需要在一个模板中嵌入命令,并用数据传输中间件进行处理。比如,考虑下面的模板:

<?xmlversion="1.0"?> 

<FlightInfo> 

<Intro>Thefollowingflightshaveavailableseats:</Intro> 

<SelectStmt>SELECTAirline,FltNumber,Depart,ArriveFROMFlights</SelectStmt> 

<Conclude>Wehopeoneofthesemeetsyourneeds</Conclude> 

</FlightInfo>

注意其中嵌入了一个SELECT语句。当用数据传输中间件进行处理的时候,每一个SELECT语句都会被它的结果所代替,用XML格式化形式表现为:

<?xmlversion="1.0"?> 

<FlightInfo> 

<Intro>Thefollowingflightshaveavailableseats:</Intro> 

<Flights> 

<Row> 

<Airline>ACME</Airline> 

<FltNumber>123</FltNumber> 

<Depart>Dec12,199813:43</Depart> 

<Arrive>Dec13,199801:21</Arrive> 

</Row> 

... 

</Flights> 

<Conclude>Wehopeoneofthesemeetsyourneeds</Conclude> 

</FlightInfo>

基于模板驱动的映射可以是相当灵活的,比如,一些产品允许你把结果集放到XML文档的任何位置,同时可以对SELECT语句设置参数,并且可以使用for循环语句和if条件语句等。值得注意的是,当前基于模板驱动的映射只能应用于在关系数据库和XML文档之间传递数据。

基于模型驱动的映射:也就是说把数据从数据库传送到XML文档是用一个具体的模型实现的,这样,XSL可以被结合到基于模型映射的产品上。在XML文档中,两种模型是很常见的:表格模型(table model)和数据专用对象模型(data-specific object model)。

2.表格模型:许多中间件软件包用表格模型在XML文档和关系数据库之间传递数据。它把XML文档表示为一个单一的表格或者是表格的集合。这样,一个XML文档的结构可以用如下的形式表示:

<database> 

<table> 

<row> 

<column1>...</column1> 

<column2>...</column2> 

... 

</row> 

... 

</table> 

... 

</database>

这里关键字"talbe"在把数据从数据库传递到XML文档的时候,表示一个单一的结果集,把数据从XML文档传递到数据库的时候,表示表示一个单一的表格或者视图。但是,当结果集合不只一个的时候,或者当XML文档包括多个复杂嵌套的时候,这种传递方式就不能适应了。

3.数据专用的对象模型:把一个XML文档表示为由数据对象构成的树,每一个元素类型和对象相对应。主要在面向对象和层次数据库中使用,通过传统的关系-对象模型也可以映射到关系数据库中。注意这种模型并不是文档对象模型(DOM)。比如,销售订单文档可以被看成一个对象树,其中包括五个类:Orders, SalesOrder, Customer, Line, 和Part。如下所示:

基于XML的数据库总体分析

当把一个XML文档看成是一个以数据为中心的对象树的时候,元素不一定和对象相对应,比如,一个元素只包含PCDATA,它能够被当成一个属性,它包括一个单一的,标量值。

实际上在XML和数据库之间进行数据转化的时候,需要考虑两个过程:一个是从数据库模式中产生DTD,另外一个是根据DTD生成数据库模式

从一个DTD中生成一个关系模式的步骤如下:

1. 对每一个元素,产生一个表和一个主键列。

2. 对每一个有混合内容的元素,产生一个独立的表格,用来存储PCDATA,并通过父表的主键和父表相联。

3. 对元素类型中的每一个单一值的属性,对具有只有PCDATA内容的子元素(该子元素按顺序出现),产生一个单独的列,如果子元素类型或者值是可以选择的话,该列就应该可以允许为NULL类型。

4. 对有多个值的属性和可以出现多次的子元素(该子元素PCDATA)的话,需要创建一个单独的表来存储这些值,并通过父表的主键和父表相联。

5. 对每一个包含元素或者混合内容的子元素来说,通过父表的主键把父元素和子元素联接起来。

从一个关系数据库模式构建DTD步骤如下:

1. 对每一个表,创建一个元素。

2. 对表中的每一列,创建一个属性或者是一个只有PCDATA 内容的子元素。

3. 根据表中的每一主键/外键关系,创建该表元素的子元素。

本文就介绍到这里,更多的内容我们会在下节中继续介绍。

原文链接:https://77isp.com/post/6759.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。