喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

$5.95 Web Hosting     

上一主题 下一主题
     
标题: [经验] XML 和数据库之间的映射  
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4855
帖子 1727
金钱 4845 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[广告]: 代充Paypal帐号美元
XML 和数据库之间的映射

XML 用户一个常见的问题是如何将 XML 映射到数据库。本文讨论基于表的映射和对象-关系映射。这两种映射常常作为在 XML 文档和数据库特别是关系数据库之间转换数据的软件的基础。在这个领域,一个重要的特点是映射是双向的,就是说可以把数据从 XML 文档转化到数据库,也可以从数据库转化到 XML 文档。
即使数据库没有自称支持 XML 特性,也可以在关系数据库中存储和检索 XML 文档。这样做需要小心地使用 Java™ 编程语言(数据库不一定兼容 Java Database Connectivity 或 JDBC),还需要一个框架来连接关系数据库和 XML 文档流。

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

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

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

code:
--------------------------------------------------------------------------------

<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. 表映射的选项(多表)


code:
--------------------------------------------------------------------------------

<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 格式的单个销售订单


code:
--------------------------------------------------------------------------------

<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 表示的单个销售订单


code:
--------------------------------------------------------------------------------

<?php
object SalesOrder 
{
number 1234;
customer "Gallagher Industries";
date 29.10.00;
items = {ptrs to Item objects};
} / 


object Item object Item {
number 1number 2;
part "A-10"part "B-43";
quantity 12quantity 600;
price 10.95price 3.99;
} }
?>
--------------------------------------------------------------------------------




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

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


映射方法论

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

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

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




在场外支持奥运.....
2006-8-28 09:26 PM#1
查看资料  访问主页  发短消息  QQ  顶部
 
刀鱼
版主
Rank: 7Rank: 7Rank: 7
好好做人,认真做事


UID 67208
精华 0
积分 677
帖子 823
金钱 677 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2005-12-15
来自 北京
状态 离线
[广告]: 代充Paypal帐号美元
好文章,顶下



有项目需求,请联系:daoyu_06@126.com.
2006-8-28 10:08 PM#2
查看资料  Blog  发短消息  QQ  顶部
 
zzffhh (zzffhh)
中级会员
Rank: 3Rank: 3
一般会员



UID 27650
精华 0
积分 201
帖子 200
金钱 201 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-4-9
状态 离线
[推荐阅读] linux下用php运行php文件不执行
是要支持的。
2006-8-30 02:34 PM#3
查看资料  发短消息  顶部
 
podcast1
新手上路
Rank: 1



UID 78814
精华 0
积分 35
帖子 30
金钱 35 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2006-8-22
状态 离线
[推荐阅读] 要PPMM头像的进来
正想学如何用php来读取xml文件,一定要顶一下。呵呵。。。。。。
但是还不太懂,郁闷……
2006-9-2 11:54 PM#4
查看资料  发短消息  顶部
 
zwyanfeng
新手上路
Rank: 1
老会员



UID 18261
精华 0
积分 12
帖子 509
金钱 12 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-2-6
状态 离线
[推荐阅读] php如何显示oracle记录
能不能 不定义配置文件  而 根据 数据库 结构 来生成object?
这样不是更方便?

这样的映射不是orm (对象关系映射)
数据关系映射  只的是  结构上的映射 而不是 数据上 的
比如 我表名student 字段为 id name sex
那么映射后的 的对象名为student
里面的属性有
id
name
sex
里面的方法有
setid
setname
setsex

save
update
delete
........

而简单的 数据 关系映射 也是 基于这个原理
方式 不只一种

不同的可能是 采取的机制不同 比如orm (java:hibernate) ,datagetway

楼主的可能是active record 吧!
2006-9-4 06:02 PM#5
查看资料  Blog  发短消息  顶部
 
zwyanfeng
新手上路
Rank: 1
老会员



UID 18261
精华 0
积分 12
帖子 509
金钱 12 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-2-6
状态 离线
[推荐阅读] 问一个目录结构的问题
对了 ,楼主能不能把实现代码 开源下   

照顾下我这理解能力差的 。 呵呵。
2006-9-4 06:03 PM#6
查看资料  Blog  发短消息  顶部
 
gubo1474
新手上路
Rank: 1
初级会员



UID 24325
精华 0
积分 29
帖子 40
金钱 29 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-11-3
来自 改网名了
状态 离线
[推荐阅读] 问一下正则方面的问题
好文,推荐!
2006-9-4 06:25 PM#7
查看资料  访问主页  发短消息  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.028309 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP