XML数据在企业应用中的应用越来越广泛,而数据库在XML数据管理方面也扮演了一个重要的角色。但是目前为止,有许多Oracle数据库从业人员对于Oracle XML来说还是比较陌生的,他们还没有习惯将XML维护放到自身的日常管理工作中来。 但是随着Oracle 11g R2数据库的推出,这一情况将有所改变。最新版本数据库软件中的XML功能让DBA可以更加轻松地进行XML数据管理实践,并且将SQL应用的影响降到了最低程度。
在本文的数据集成应用案例中,我们将向您展示XML数据的关系型访问,并同时介绍Oracle 11g R2数据库在这方面的功能增强。 Oracle 11g R2中XML数据的……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
XML数据在企业应用中的应用越来越广泛,而数据库在XML数据管理方面也扮演了一个重要的角色。但是目前为止,有许多Oracle数据库从业人员对于Oracle XML来说还是比较陌生的,他们还没有习惯将XML维护放到自身的日常管理工作中来。
但是随着Oracle 11g R2数据库的推出,这一情况将有所改变。最新版本数据库软件中的XML功能让DBA可以更加轻松地进行XML数据管理实践,并且将SQL应用的影响降到了最低程度。在本文的数据集成应用案例中,我们将向您展示XML数据的关系型访问,并同时介绍Oracle 11g R2数据库在这方面的功能增强。
Oracle 11g R2中XML数据的关系型访问
XML数据集成在目前的企业IT部门中已经受到了越来越多的重视,而且这部分功能在数据库方面的应用更加广泛,实现也相对简单。XML文档通常是首先进行分割,然后再放入到关系表中来被SQL应用所访问。文档分割是一种相对复杂的操作,有些时候甚至是费力不讨好的。另一种更好的方式就是省略文档分割这一步,直接将XML数据放入数据库之中,然后在XML结构之上添加一个关系型视图。
在下面的一个示例中,我们演示了如何使用Oracle自带的XML数据库功能来实现对XML数据的关系型访问。
'<?xml version="1.0"?> <PurchaseOrder> <OrderNumber>11111</OrderNumber> <OrderDate>2010-01-15</OrderDate> <CustomerName>Joe Smith</CustomerName> <User>JSMIT</User> <SpecialInstructions>Air Mail</SpecialInstructions> <LineItems> <LineItem ItemNumber="1"> <Description>Bubble Gum</Description> <Part Id="7155" UnitPrice="19.95" Quantity="2"/> </LineItem> <LineItem ItemNumber="2"> <Description>Blow Pops</Description> <Part Id="3742" UnitPrice="15.95" Quantity="2"/> </LineItem> </LineItems> </PurchaseOrder>' |
如下所示,ABC Gum公司的数据集成hub需要从源系统中接收XML文档。公司正在寻找一个简单的解决方案,可以使用Oracle数据库处理格式良好的XML文档,并以关系型的方式进行展现。这样公司基于SQL的应用就可以在数据发布到XML应用之前对数据进行控制、归档和清洗操作。
注意该XML文档包含了一个LineItem集合(重复元素),它与一个master-detail模型相类似。
创建XML表、关系型视图和索引
我们首先从创建一个单一的schema-less XML表来存储复杂订单开始。注意创建表的时候选择XML数据类型,或者选择XML类型的列。到目前为止,我们已经将一个多表关系型数据模型简化为一个单一的物理表了。
create table abc_purchase_order of xmltype (constraint abc_purchase_order_pk primary key (order_number)) xmltype store as securefile binary xml (compress high) virtual columns (order_number as (xmlcast(xmlquery('/PurchaseOrder/OrderNumber' passing object_value returning content) as number (5))) ,order_date as (xmlcast(xmlquery('/PurchaseOrder/OrderDate' passing object_value returning content) as date)) ) partition by range (order_date) ( partition yr_2010 values less than(to_date('01/01/2011','mm/dd/yyyy')) ,partition yr_2011 values less than (to_date('01/01/2012','mm/dd/yyyy')) ) ; |
Oracle 11g R2中值得注意的XML功能增强包括针对LOB存储、二进制XML类型存储和分区的SECUREFILE。SECUREFILE比BASICFILE更适合LOB存储,究其原因有以下几点:去重、压缩、加密、缓存以及分段更新等。二进制XML类型存储是一个post-parsed格式,它提供了灵活性、存储优化以及性能增强。分区由虚拟列来实现,它提供了可管理性、可用性以及对信息生命周期管理的支持。
接下来,我们将通过在XML结构之上创建一个关系型视图的方式来展示订单,让它可以进行SQL访问。这就是视图如何提供并隐藏XML数据结构(如elements)到关系型结构(如列)的转换,通过转换可以使得SQL应用读取XML数据。
create view abc_po_master_detail_view as select m.order_number, m.order_date, m.customer_name, m.userid, m.special_instructions, d.* from abc_purchase_order po, xmltable('/PurchaseOrder' passing po.object_value columns order_number number(5) path 'OrderNumber', order_date date path 'OrderDate', customer_name varchar2(30) path 'CustomerName', userid varchar2(10) path 'User', special_instructions varchar2(80) path 'SpecialInstructions', lineitem xmltype path 'LineItems/LineItem') m, xmltable('LineItem' passing m.lineitem columns itemno number(10) path '@ItemNumber', description varchar2(25) path 'Description', partno varchar2(14) path 'Part/@Id', quantity number(12,2) path 'Part/@Quantity', unitprice number(8,4) path 'Part/@UnitPrice') d; |
然后我们将向XML文档的普通查询部分添加结构化与非结构化的索引,这样可以进一步提升性能。结构化的XML索引组件使用关系型表(关系型索引结构)来组织结构化的XML数据内容,这对于Oracle数据库来说是全新的体验。对于未进行分区的表,定义一个XMLIndex索引将所有在关系型视图中的字段包含进来,可以确保一个关系型视图查询索引结构完全来自于下层的XMLIndex内容表,从理论上来说可以获得关系型的性能。此外,标准关系型二级索引可以在结构化索引的列上创建,高效地进行索引可以使得性能更进一步。
create index abc_purchase_order_ak01 on abc_purchase_order (object_value) indextype is xdb.xmlindex parameters ('xmltable abc_po_idx ''/PurchaseOrder'' columns order_number number(5) path ''OrderNumber'' ,order_date date path ''OrderDate'' ,customer_name varchar2(30) path ''CustomerName'' ,userid varchar2(10) path ''User'' ,special_instructions varchar2(80) path ''SpecialInstructions'' ,lineitems xmltype path ''LineItems/LineItem'' virtual xmltable abc_po_lineitem_idx ''/LineItem'' passing lineitems columns itemno number(10) path ''@ItemNumber'' ,description varchar2(25) path ''Description'' ,partno varchar2(14) path ''Part/@Id'' ,quantity number(12,2) path ''Part/@Quantity'' ,unitprice number(8,4) path ''Part/@UnitPrice'' ') local parallel; -- Create secondary B-tree and Full Text indexes on the structured XML index create index abc_purchase_order_ak02 on abc_po_idx (customer_name) local; create index abc_purchase_order_ak03 ON abc_po_lineitem_idx ( |
关于作者
Jeff McCormick就职于著名医疗机构,担任首席架构师,同时是Connecticut Oracle User Group(康涅狄格州Oracle用户组)的主席。McCormick拥有20余年的IT从业经验,并专注于数据集成与基础架构管理领域,同时拥有包括Oracle、微软以及Sybase在内的多个认证专家证书。
翻译
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。