当前位置: 首页 > 面试题库 >

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

云瑞
2023-03-14
问题内容

我有一个创建datarequests会非常复杂的应用程序。这些需要作为表存储在数据库中。datarequest(作为XML)的轮廓将是…

<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可以在其父元素中出现多次属性-
所述例外是所述filterdatefilter

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

当请求通过时,像这样的XML作为存储的proc的参数发送到SQLServer。此XML切碎成一个反规范化的表,然后写入反复向规范化的表,如tblDataRequest (DataRequestID PK)tblDataTasktblFiltertblSeries。这可以。

当我想 将给定的XML定义与数据库中已保存的一个匹配 时,就会出现问题。我目前是通过…

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

..这将返回任何与给定XML完全匹配的DataRequestID。我担心这种方法最终会变得非常缓慢,部分原因是我不相信CTE会进行任何聪明的过滤,它会
应用大数据 之前 每次提取所有数据WHERE

我认为必须对此有更好的解决方案,例如

  • 在存储时datarequest,还应以某种方式存储datarequest的哈希,并在此之上进行简单匹配。如果发生碰撞,请使用当前方法。但是我想使用set-logic来做到这一点。而且,我担心更改哈希的XML中无关紧要的小差异-虚假空间等。
  • 以某种方式从下而上迭代地执行匹配。例如,产生一个与最低级别匹配的过滤器列表。将其用作IN匹配系列的一部分。使用它作为IN匹配DataTasks等的一部分。问题是,当我考虑太长时间时,我开始停电。

基本上-有没有人曾经遇到过此类问题(他们必须有)。 推荐的解决方法是什么?示例(伪)代码将是巨大的:)


问题答案:

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

另外,由于您已经有了将其解析为非规范化登台表的代码,所以也可以。然后,我将简单地使用FOR
XML
创建一个新的XML文档。

您的目标是创建一个标准化的XML文档,该文档在适当的情况下尊重排序,并在不存在的情况下消除不一致之处。

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

要进行实际的比较,您可以使用哈希,将XML存储为字符串并进行直接的字符串比较,或进行完整的XML比较,如下所示:http :
//beyondrelational.com/modules/2/blogs/28/帖子/ 10317 / xquery-
lab-36-编写一个tsql函数以比较两个xml值-
part-2.aspx

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



 类似资料:
  • 我需要展平一个数据帧,以便将其与Spark(Scala)中的另一个数据帧连接起来。 基本上,我的2个数据帧有以下模式: 数据流1 DF2 老实说,我不知道如何使DF2变平。最后,我需要连接DF.field4 = DF2.field9上的2个数据帧 我用的是2.1.0 我的第一个想法是使用爆炸,但在Spark 2.1.0中已经被否决了,有人能给我一点提示吗?

  • 我想将此Firebase实时数据库结构转换为fiRecovery数据结构,请提供一些帮助。 我想要那种结构,比如Posts(集合)/pin(集合)/pid(文档)/然后是post描述,但是我知道一个集合不能包含另一个集合,所以我应该怎么做? “所有_帖子”节点包含pid和pin,仅用于共享该帖子,然后使用pin和pid获取帖子详细信息。 在我的结构中还有一件事发布-

  • 数据与数据结构 1. 数据 1.1 数据(data) 数据:是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。 1.2 数据大致分的两类:(1)数值性数据;(2)非数值数据 数值性数据:主要包括整数、浮点数、复数、双精度数等,主要用于工程和科学计算,以及商业事务处理。 非数值数据:主要包括字符和字符串,以及文字、图形、图像、语音等数据。 1.3

  • 问题内容: Java中对contains()操作最快的数据结构是什么? 例如,我有一组数字{1,7,12,12,14,20 …} 给定另一个任意数字x,(平均)最快的方法是生成x是否包含在集合中的布尔值?!contains()的概率大约高5倍。 是否所有地图结构都提供o(1)操作?HashSet是最快的方法吗? 问题答案: 看一下基于集合(哈希集,枚举集)和哈希(HashMap,linkedhas

  • 我正在处理一个项目,它有多个进程,每个进程都有不同的数据项要处理。数据项(对于不同的进程)有不同的列(但对于相同的进程总是相同的列)。 一开始,我假设为所有流程创建一个表是很好的,然后,每当创建一个新流程时,也可以创建另一个包含项目数据的表,但事实证明,将会有一种新的流程方法来经常创建新的表。然后我研究了嵌套表,但发现MySQL中没有嵌套表的概念。(我听说这可以用MariaDB完成,有人用过吗?)

  • PHPSSO 数据库结构[更新日期:2010-12-28] 点击查看 PHPCMS 数据库结构[更新日期:2010-12-28] 点击查看