• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

节点同名的表中的列的外键关系,列
的名字是父元素的名字加一个前缀
p k _。
(2) 属性
我们需要的三个表中的第一个是P u b l i s h e r表。模式定义告诉我们所需要的表的信息:
程序清单1 0 - 4 3
就像< C a t a l o g >元素,一个< P u b l i s h e r >元素只能包含其他元素—它能包含非混合的内容。
元素是< C o r p o r a t e N a m e >,< A d d r e s s >,< I m p r i n t s >和< A u t h o r >,如图
1 0 - 2 1所示。
应用分层规则我们建立了四张表,并且建立了它们之间的关系。
然而,< P u b l i s h e r >也有一个叫做i s b n的属性节点。它可以非常容易地被
表示为P u b l i s h e r表的一个字段,并且我们将给它同节点一样的名字。注
意,节点结构表明需要一个属性节点,所以应该通过在表中增加要求
字段而实现它。因为不允许NULL值,所以如图10-22所示定义这个列。
现在可以定义另一个规则:
• 规则3—对于每个属性节点。
• 创建一个与属性节点同名的列。
• 如果要求属性,那么列不允许为N U L L值。
(3) 纯文本元素
< P u b l i s h e r >元素可以包含的下一个元素是< C o r p o r a t e N a m e >,定
义如下:
<ElementType name="CorporateName" content="textOnly"/>
像第一个规则要求的那样,我们将创建一个名为C o r p o r a t e N a m e的表。在根据规则设置好键
值之后,一个在P u b l i s h e r表和C o r p o r a t e N a m e表之间的一对一的关系就出现了,如图1 0 - 2 3所示。
以一个数据库的观点,用于c o r p o r a t e N a m e的额外的表是不必要的。这就是说,数据被放入
到另外一个表,正像P u b l i s h e r 表的一列。而从X M L 角度,额外的表也是不必要的。
398使用XML 高级编程
下载
图10-21
图10-20
< C o r p o r a t e N a m e >元素的内容仅是文本—它不能包含任何子节点—所以可以被容易地存储为
P u b l i s h e r表中的一列。因此, P u b l i s h e r表更有效的形式如图1 0 - 2 4所示。
图10-22
图10-23
图10-24
比起每一个元素都有一个表,它提高了性能,因为它不需要创建许多的连接来取得数据。
为了取得< P u b l i s h e r >信息,只需要下面的查询:
然而使用一个独立的公司名称表,需要这样做:
尽管看上去好像没有什么多余的工作,只用了一个查询来检索出版商地址,但当我们看到
后面的地址模式时,将会发现这是多么的复杂—并且可能很慢。
在实现一个用于X M L数据的关系存储时,应决定哪一个字段应该是属性,哪一个应该是纯
文本元素,这是件很容易的事。建好以后,刚刚在P u b l i s h e r表中描述的数据可以被输出为元素:
程序清单1 0 - 4 4
或者输出为元素的属性:
我们没有一个简单的方法知道哪一个是更好的输出,那么问题是用什么方法来表示数据库
第10章XML和数据库使用399 下载
是最佳的,但我们应能容易重新生成X M L。一种可以考虑的技术是在输出之前,把模式当作数
据。另一种方法是在取得数据后,对它进行转换,然后每一个字段作为属性重新返回。
这两种方法可能适用于不同的情况,被用在某些在前面关系数据库部分所描述的工具中。
在这里我们使用了一个简单方法,它是在数据库中将列命名,通过这种方法就很容易重新取回
丢失的信息。如果属性用a t t r _作为前缀,纯文本元素使用e l e m _,那么应该能够很容易区分它们
的不同。我们需要修改规则3,以包括前缀a t t r _:
• 规则3—对于每个属性节点。
• 创建一个与属性节点同名的列,使用前缀a t t r _。
• 如果要求属性,那么列不应该允许为N U L L值。
我们也可以包含下一个规则:
• 规则4—如果一个元素的节点只包含文本,那么在它的父元素表中创建一列,列的名字
与节点一样,使用前缀e l e m _。
(4) 纯文本元素的多发性
尽管把一个纯文本元素作为一个字段是一个有用的优化,也存在不能用的情况。当元素可
以显示一次或多次的时候就是这种情况。如果我们继续处理模式,可以看到< S t r e e t >元素就只包
含文本,但是它可以在地址的街道部分表示为多行:
程序清单1 0 - 4 5
尽管< S t r e e t >没有子元素,但是由于它具有多个值,所以不能在关系数据库用一列来实现。
所以我们需要增加一个表来保存< S t r e e t >的多个值。首先让我们改一下规则4:
• 规则4—如果一个元素的节点只包含文本,并且最大发生次数为1次,那么在它的父元素
表中创建一列,列的名字与节点一样,使用前缀e l e m _。
这就意味着我们已经拥有了所有要完成A d d r e s s表的规则—没有S t r e e t列—看上去将如图
1 0 - 2 5所示。
然而,在创建S t r e e t表之前还有一个问题。到现在为止,我们创建的用来保存元素信息的所
有表都简单地与它的父元素相关联,并可能拥有属性。然而< S t r e e t >元素没有属性但是包含自己
的数据。所以需要在一个表中用一列来保存它。但是因为这个数据不是一个属性或是一个纯文
本的子元素,所以我们无法命名。在一个关系数据库中,每一列必须有一个名字,所以把它叫
400使用XML 高级编程
下载
做p c d a t a。
图10-25
现在S t r e e t表将如图1 0 - 2 6所示。
图10-26
使用这个表,地址中街道部分的数据可能如图1 0 - 2 7所示。
图10-27
在这个例子中有两个地址,第一个使用了街道记录为1,2和3,第二个使用4和5。现在需要
修改规则2来处理元素拥有自己文本内容的情况:
• 规则2—对每一个元素节点类型,创建一个与元素相同名字的表,然后:
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(130)