曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
• 如果元素节点是一个子节点,创建一个与父元素节点同名的列,但是使用前缀f k _。
• 创建一个在刚创建的列和与其父元素节点同名的表中的列的外键关系,列的名字是父元素
的名字加一个前缀p k _。
• 如果元素节点的内容只是本文,那么创建一个名字为p c d a t a的列。
一个元素的多发性是在< R e c S u b j C a t e g o r i e s >里定义的:
程序清单1 0 - 4 6
< R e c S u b j C a t e g o r i e s >元素本身容易模拟;只要创建一个新表。可能有一些冗余—因为在
第10章XML和数据库使用401 下载
这种情况下一个< C a t e g o r y >可能只关联了一个< B o o k >—但是我们不得不保留看上去冗余的表,
以便在需要时重建正确的X M L结构(在后面将进一步讨论)。
比较难于模拟的部分是< C a t e g o r y >元素出现了三次。这意味着我们不能使用通常的规则,因
为既不能创建三个名为C a t e g o r y 的表— 如果C a t e g o r y 元素不只是文本— 也不能在
R e c S u b j C a t e g o r i e s表中创建三个名叫C a t e g o r y的表—因为< C a t e g o r y >只是文本。
我们有一个规则说明,如果一个元素发生一次以上,它必需放在自己的表中,所以我们将
创建一个名为C a t e g o r y的表。然而,我们会看到当开始写元素处理代码时,需要:
• 在当前的分层中计算元素的处理会发生的次数。
• 不要在一个元素再次发生时创建一个新表。
如果按照下面的定义,结果表将没有什么不同:
程序清单1 0 - 4 7
实际上一个触发器只能触发3次。
注意这个规则假设后续的分类不重要。如果很重要,可以在SQL DDL中加入位置指示器用
来指示元素显示的顺序。
(5) 枚举
在我们查看关于地址的模式时,你可能已经认识到h e a d q u a r t e r s属性值只能是y e s或n o。一种
可以实现的方法是把h e a d q u a r t e r s创建为一个布尔字段,但这在后面可能会产生问题,例如再增
加一个'Used To Be'的选项。这样的话,我们希望建立对枚举的一般的需求,以便可以用在任何
环境下。
首先,需要设置一个表,用来保存枚举值(如图1 0 - 2 8)。把它叫做e n u m _ h e a d q u a r t e r s用来
减少与其他名字冲突的可能性。
图10-28
这个表仅有一列,因为它只需要包含h e a d q u a r t e r s所可能有的值。因为
它们是唯一的,所以可以被设置为主键。在表中的数据如图1 0 - 2 9所示。
这就给出枚举的规则:
• 规则5—对于每一个具有枚举类型的属性,用与属性节点值相同的
名字创建一个表,使用前缀e n u m _。包含一个与属性节点同名的可变长字符串列,使用前
缀p k _ e n u m _和variable-legnth string数据类型。把枚举的值填在表中。
我们需要再次修改规则3,以保证不会丢失被枚举的属性的信息:
• 规则3—对于每个属性节点:
402使用XML 高级编程
下载
图10-29
• 创建一个与属性节点同名的列:
- 如果属性是一个正常的属性使用前缀a t t r _。
- 如果属性是一个枚举类型使用前缀a t t r _ e n u m _。
• 如果要求属性,那么列不应该允许为N U L L值。
实际上我们仍然没有完成规则3!在后面会看到更多⋯⋯
(6) 拥有i d数据类型的属性
出版商的定义的下一部分是它的名称和地址的列表:
程序清单1 0 - 4 8
每一个< P u b l i s h e r >都有一个叫做< I m p r i n t s >的元素,按顺序包含名为< I m p r i n t >的元素。每
一个< I m p r i n t >元素都有一些文本,像名称和地址的标题和一个叫s h o r t I m p r i n t N a m e的属性,它是
i d类型数据。
使用规则2我们创建了两个新表, I m p r i n t s和I m p r i n t,每一个都指向它们的父元素。第一个
表看上去如图1 0 - 3 0所示。
图10-30
第二个表—I m p r i n t—包含文本内容,所以有一个p c d a t a列。这也是按规则2处理的。仅
有一件事我们没有注意到,就是s h o r t I m p r i n t N a m e属性。这个属性为i d类型,意思就是它将用于
X M L文档的其他部分,用来引用一个元素。实际上,这个模式已经设置了这样一种方式就是
< T h r e a d >元素—稍后我们就会看到—可以通过引用它的简称来指向一个名称地址。因为使
用了枚举信息,我们不想丢掉这个信息,所以我们通过在列的前面加上a t t r _ i d _来保留它。所以
修改规则3:
• 规则3—对于每个属性节点:
• 创建一个与属性节点同名的列:
- 如果属性是一个正常的属性使用前缀a t t r _。
- 如果属性是一个枚举类型使用前缀a t t r _ e n u m _。
- 如果属性是i d类型使用前缀a t t r _ i d _。
• 如果要求属性,那么列不应该允许为N U L L值。
所以I m p r i n t表看上去如图1 0 - 3 1所示。
第10章XML和数据库使用403 下载
图10-31
(7) 作为容器的元素
注意在这里我们介绍的一些冗余的东西是不可避免的。如果我们在设计这个数据库的时候
没有想过将数据输出为X M L,那么可能不需要I m p r i n t s表,因为它只允许I m p r i n t表中的名称地址
能够同P u b l i s h e r表相连接。像这样的一个表结构通常是用在当想让每一个出版商有许多名称地
址的时候,但是在我们的模式中,每一个出版商仅有一个名称地址。如果我们从节点的角度来
表现这个数据库结构,那么下面如图1 0 - 3 2所示的两个结构没有什么不同。
图10-32
这是因为,I m p r i n t s没有自己的数据—它只是其他数据的一个简单容器。然而,尽管我们
想使关系数据库尽可能的高效,但也不得不保留这个表,与没必要的多个的连接在一起。否则
当输出X M L的时候,将没有办法知道在< P u b l i s h e r >与每个< I m p r i n t >之间有一个包含元素。
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程上(131)