分享

技巧:XML 和数据库之间的映射

 todaytomo 2007-01-18

技巧:XML 和数据库之间的映射

掌握将数据映射到 XML 模式的简单方法

级别: 中级

Hany Saleeb, 技术顾问, Freelance

2005 年 12 月 08 日

XML 用户一个常见的问题是如何将 XML 映射到数据库。本文讨论基于表的映射和对象-关系映射。这两种映射常常作为在 XML 文档和数据库特别是关系数据库之间转换数据的软件的基础。在这个领域,一个重要的特点是映射是双向的,就是说可以把数据从 XML 文档转化到数据库,也可以从数据库转化到 XML 文档。

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





回页首


参考资料

学习

讨论




回页首


关于作者

Hany Saleeb 博士的照片

Hany Saleeb 曾经在多家技术、金融和卫生保健企业中工作过。 他的专长是和 J2EE、XML 以及数据库有关的应用软件和 n 层系统设计。他拥有计算机科学博士学位,主攻数据挖掘和信息检索。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多