XML 和数据库之间的映射

本文介绍了将XML文档存储和检索于关系数据库的两种方法:基于表的映射和对象-关系映射。基于表的映射简单但限制较多,适合小型文档;对象-关系映射则提供数据库独立性、自动化连接处理等优势,适用于更复杂的XML文档。文章强调了映射方法的选择应考虑数据的特性和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hany Saleeb , 技术顾问, Freelance

2005 年 12 月 08 日

即使数据库没有自称支持 XML 特性,也可以在关系数据库中存储和检索 XML 文档。这样做需要小心地使用 Java™ 编程语言(数据库不一定兼容 Java Database Connectivity 或 JDBC),还需要一个框架来连接关系数据库和 XML 文档流。

将 XML 映射到数据库有两种常见的方法:基于表的映射和对象-关系(或基于对象的)映射。这两种方法都是双向的,因此可用于存储和检索 XML 文档。

基于表的映射

基于表的映射 将文档看作一个表或者一组表。清单 12 显示了这两种情况下的文档结构。


清单 1. 表映射的选项(单表)


   <Table ABC>
      <Row1>
         <Column_a>123-45-7890</Column_a>
         <Column_b>Johnson, Eric</Column_b>
         <Column_c> Pharmaceutical </Column_c>
      </Row1>
      <Row2>
         <Column_a>999-00-1010</Column_a>
         <Column_b>Mitchell, Bruce</Column_b>
         <Column_c> Industrial </Column_c>
      </Row2>
   </Table ABC>


清单 2. 表映射的选项(多表)

    <Tables>
      <Table_1>
         <Row1>
            <Column_a>123-45-7890</Column_a>    
            <Column_b> Johnson, Eric </Column_b>
            <Column_c>Company A</Column_c>
         </Row1>
         <Row2>
            <Column_a>999-00-1010</Column_a>
            <Column_b> Mitchell, Bruce </Column_b>
            <Column_c> Company  B</Column_c>
         </Row2>
      </Table_1>
      <Table_2>
         <Row1>
            <Column_a>Company A</Column_a>
            <Column_b>Pharmaceutical</Column_b>
         </Row1>
         <Row2>
            <Column_a>Company B</Column_a>
            <Column_b>Industrial</Column_b>
         </Row2>
      </Table_2>
   </Tables>

这种映射最明显的优点是简单。因为结构与关系数据库的表及结果集匹配,根据这种映射编写代码很容易。代码执行快、伸缩性好,对某些应用很合适,比如每次一个表在数据库之间传递数据。

但是,基于表的映射也有一些不足之处。它只能用于非常小的 XML 文档子集。此外,它没有保留物理结构(即字符和实体引用、字符编码或独立的声明)、文档信息(即文档类型声明或 DTD)、注释和处理指令。


对象-关系映射

基于表的映射只能用于有限的 XML 文档,因此多数支持 XML 的关系数据库、大部分支持 XML 的对象服务器以及一些中间件工具使用更加复杂的映射,称为对象-关系映射。这种映射方法将 XML 文档建模为针对文档数据的一棵对象树,然后将这些对象映射到数据库。

比如 清单 3 所示的 XML 文档。


清单 3. XML 格式的单个销售订单


   <SalesOrder>
      <Number>1234</Number>
      <Customer>Gallagher Industries</Customer>
      <Date>29.10.00</Date>
      <Item Number="1">
         <Part>A-10</Part>
         <Quantity>12</Quantity>
         <Price>10.95</Price>
      </Item>
      <Item Number="2">
         <Part>B-43</Part>
         <Quantity>600</Quantity>
         <Price>3.99</Price>
      </Item>
   </SalesOrder>

该文档映射为 清单 4 所示的对象。


清单 4. 层次化 XML 表示的单个销售订单


      object SalesOrder {
         number = 1234;
         customer = "Gallagher Industries";
         date = 29.10.00;
         items = {ptrs to Item objects};
      }         /             /
               /               /
              /                 /
   object Item {       object Item {
      number = 1;         number = 2;
      part = "A-10";      part = "B-43";
      quantity = 12;      quantity = 600;
      price = 10.95;      price = 3.99;
   }                   }

该方法是层次化的,对数据映射来说很直观。数据库对象带来了一些优点,其中包括:

  • 数据库独立性:数据库对象从根本上是独立于数据库创建的,不依赖于特定底层数据特性来提供其功能。这种独立性使您可以使用数据库对象迅速将应用程序构建从一种数据库平台转移到另一种数据库平台,提供了很大的可伸缩性。
  • 自动化的连接处理:自动化连接处理能够连接、断开和管理系统资源。对客户机对象的抽象可以提供更好的控制和性能。
  • 声明性的引用完整性:通过直接在数据库对象中嵌入访问逻辑,可以获得和使用存储过程访问数据库同样的好处,而且不依赖于特定平台。引用完整性成了数据库独立性,数据库对象之间的复杂关系成了可移植性。比如,可以在数据库对象中集成业务规则,让访问该对象的所有应用程序都保证遵守这些规则。
  • 多层验证:可以在对象或者其父对象上执行检查。这样就可以规范和验证访问、权限以及数据完整性。
  • 避免内嵌 SQL:使用数据库对象可以使应用程序避免内嵌 SQL 及其维护的困难和系统依赖性。如果应用程序只与其他 Java 对象交互,系统的设计就可以是完全面向对象的。
  • 安全:可以确保与数据库对象的任何交互的安全,并容易地保证数据安全。


映射方法论

实现对象-关系映射需要两步。首先将 XML 模式(这里使用 DTD)映射到对象模式,然后将对象模式映射到数据库模式。也可以将这两种映射合并成一个 DTD 到数据库的映射,现在多数软件都是这样做的。

表 1 中的例子显示的简单元素类型 BDE 被映射到字符串,而复杂元素类型 AC 被映射到类。在对象-关系映射的第一部分,AC 的模型和属性被映射到类 AC 的属性。AC 的内容模型中对 BDE 的引用被映射为字符串。

表 1. 对象关系映射,第 1 部分
DTD
<!ELEMENT A (B, C)> <!ELEMENT B (#PCDATA)> <!ELEMENT C (D, E)> class A { String b; C c; }
<!ELEMENT D (#PCDATA)> <!ELEMENT E (#PCDATA)> class C {String d; String e; }

对象-关系映射的第二部分(参见表 2)中,类映射到表,标量属性映射到列,指针/引用属性映射到主键/外键关系。A 的内容模型中对 C 的引用被映射到 pointer/reference 类型的属性,指向类 C 的对象,因为元素类型 C 被映射到类 C

表 2. 对象关系映射,第 2 部分
class A {String b; C c; } Table A: Column b Column c_fk
class C {String d; String e; } Table C: Column d Column e Column c_pk


 

结束语

两种映射都是对 XML 文档中的数据 而不是对文档本身建模。因此映射更适合于以数据为中心的文档而不是以文档为中心的文档。虽然对象-关系映射是采用面向对象的技术,但是也不够理想。基于表的映射根本不能处理混合内容,而从性能的角度看对象-关系映射可能效率很低。使用哪种方法都行,但是必须记住这些警告。


参考资料

学习


讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值