首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将嵌套XML数据与数据库表结构匹配的最快方法

将嵌套XML数据与数据库表结构匹配的最快方法
EN

Stack Overflow用户
提问于 2012-10-01 13:32:05
回答 1查看 529关注 0票数 3

我有一个创建datarequests的应用程序,它可能非常复杂。这些需要作为表存储在数据库中。datarequest (作为XML)的大纲将是.

代码语言:javascript
复制
<datarequest>
  <datatask view="vw_ContractData" db="reporting" index="1">
    <datefilter modifier="w0">
      <filter index="1" datatype="d" column="Contract Date" param1="2009-10-19 12:00:00" param2="2012-09-27 12:00:00" daterange="" operation="Between" />
    </datefilter>
    <filters>
      <alternation index="1">
        <filter index="1" datatype="t" column="Department" param1="Stock" param2="" operation="Equals" />
      </alternation>
      <alternation index="2">
        <filter index="1" datatype="t" column="Department" param1="HR" param2="" operation="Equals" />
      </alternation>
      </filters>
    <series column="Turnaround" aggregate="avg" split="0" splitfield="" index="1">
      <filters />
    </series>
    <series column="Requested 3" aggregate="avg" split="0" splitfield="" index="2">
      <filters>
        <alternation index="1">
          <filter index="1" datatype="t" column="Worker" param1="Malcom" param2="" operation="Equals" />
        </alternation>          
      </filters>
    </series>
    <series column="Requested 2" aggregate="avg" split="0"  splitfield="" index="3">
      <filters />
    </series>
    <series column="Reqested" aggregate="avg" split="0" splitfield="" index="4">
      <filters />
    </series>
  </datatask>
</datarequest>

这编码一个数据请求包括一个数据交换,主要过滤器,系列和系列过滤器。基本上,任何具有index属性的元素都可以在其父元素中多次发生--这是datefilter中的filter例外。

但这是一种学术性的结构,问题更为根本:

当请求通过时,像这样的XML会作为参数发送给SQLServer,作为存储的proc的参数。这个XML被分解成一个非规范化的表,然后迭代地写到标准化的表中,比如tblDataRequest (DataRequestID PK)tblDataTasktblFiltertblSeries。这很好。

当我想要将给定的XML定义与DB中已经保存的定义匹配时,就会出现这个问题。我现在是通过..。

  • 将XML分解成非标准化的表。
  • 使用CTE将数据库中的所有现有数据提取到相同的非规范化表单中。
  • 使用巨大的WHERE条件进行匹配(34行长)

..This将返回与给定的DataRequestID完全匹配的任何DataRequestID。我担心这种方法最终会缓慢得令人痛苦--部分原因是我不相信CTE会做任何聪明的过滤,在应用庞大的WHERE之前,它每次都会提取所有数据。

我认为一定有更好的解决办法

  • 在存储datarequest时,还以某种方式存储数据请求的散列,并在此基础上进行简单匹配。在发生碰撞的情况下,使用当前方法。不过,我想用集合逻辑来做这件事。此外,我还关注XML中不相关的小差异,改变散列伪空间等等。
  • 不知怎么地,从下向上迭代地执行匹配。例如产生一组与最低级别匹配的过滤器的列表。使用它作为IN的一部分来匹配系列。使用它作为IN的一部分来匹配DataTasks等等。问题是,当我考虑这个问题太久时,我就开始昏厥。

基本上--以前有没有人遇到过这样的问题(他们肯定遇到过)。解决这个问题的推荐路线是什么呢?示例(伪)代码将是很棒的:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-25 15:01:51

为了消除微小变化的可能性,我会通过XML转换(XSLT)运行请求。

或者,由于您已经获得了将其解析为一个非规范的暂存表的代码,所以这也很好。然后,我只需使用对于XML创建一个新的XML。

这里的目标是创建一个标准化的XML文档,在适当的情况下尊重顺序,并消除不一致的地方。

完成后,将其存储在新表中。现在您可以直接将“标准化”请求XML与现有数据进行比较。

要进行实际比较,可以使用散列,将XML存储为字符串并进行直接字符串比较,或者执行完整的XML比较,如:http://beyondrelational.com/modules/2/blogs/28/posts/10317/xquery-lab-36-writing-a-tsql-function-to-compare-two-xml-values-part-2.aspx

只要XML不超过8000字节,我的首选是创建一个唯一的字符串(如果您有特殊的字符支持,则创建一个惟一的字符串( VARCHAR(8000)或NVARCHAR(4000) ),并在该列上创建一个唯一的索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12674327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档