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

2024-02-01

我有一个创建的应用程序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属性可以在其父元素中多次出现 - 例外情况是filter within datefilter.

但这个结构有点学术性,问题更根本:

当请求通过时,像这样的 XML 会作为存储过程的参数发送到 SQLServer。该 XML 被分解为非规范化表,然后迭代写入规范化表,例如tblDataRequest (DataRequestID PK), tblDataTask, tblFilter, tblSeries。这可以。

当我想要的时候问题就出现了将给定的 XML 定义与数据库中已保存的定义进行匹配。我目前这样做是通过...

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

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

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

  • 当存储一个datarequest,还以某种方式存储数据请求的哈希值并简单地进行匹配。如果发生碰撞,请使用当前方法。然而我想使用集合逻辑来做到这一点。而且,我担心 XML 中不相关的小差异会改变散列 - 虚假空格等。
  • 以某种方式从下到上迭代地执行匹配。例如,生成在最低级别上匹配的过滤器列表。使用它作为IN匹配系列。使用它作为IN匹配 DataTasks 等。问题是,当我想这个问题太久时,我开始昏厥。

基本上 - 有没有人曾经遇到过这种问题(他们一定遇到过)。解决这个问题的推荐路线是什么?示例(伪)代码会很棒:)


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

或者,由于您已经获得了将其解析为非规范化暂存表的代码,这也很好。然后我会简单地使用FOR XML http://msdn.microsoft.com/en-us/library/ms178107.aspx创建一个新的 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 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))并在列上创建唯一索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 分组依据检索 3 个值

    我有以下查询 SELECT Cod MIN Id AS id Min MAX Id AS id Max retrieve value in the middle COUNT AS Tot FROM Table a NOLOCK GROUP
  • SQL Server - 如何向登录名授予对所有数据库的读取访问权限?

    我需要向新登录授予对服务器上所有 300 个数据库的读取权限 如何在不选中用户映射区域中的 300 个复选框的情况下完成此操作 一种方法是在 SSMS 的查询菜单上设置 结果为文本 然后执行以下命令 它实际上并不进行更改 而是生成一个脚本供
  • 如何获取共同好友列表

    你好 我想知道如何才能找到共同的朋友 我目前在思考这个问题时遇到问题 我有一个名为 users 的表 它是这样的 id name 1 Kenny 2 Jack 3 Jimmy 4 Chris 5 Meg 6 Jake 7 Micheal 8
  • 方法“Boolean Contains(System.String)”不支持对 SQL 的转换

    方法 Boolean Contains System String 不支持对 SQL 的转换 查询是 IsQueryable 但这停止工作 foreach string s in collection1 if s Length gt 0 q
  • SQL 中的代码重用和模块化

    代码重用和模块化对于 SQL 存储过程编程来说是一个好主意吗 如果是这样 将这些功能添加到 SQL 存储过程代码库的最佳方法是什么 我通常为常见且重复的任务创建标量值函数 我发现它不仅可以简化与现有程序类似的新程序的开发 而且还有助于错误跟
  • 金融 - 计算到期收益率

    我读了this https stackoverflow com questions 1173555 open source financial library specifically yield to maturity发布关于 net 库
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 如何比较 Postgresql 中日期时间字段中的日期?

    在比较 postgresql Windows 中的版本 9 2 4 中的日期时 我遇到了一个奇怪的情况 我的表中有一列说update date与类型timestamp without timezone 客户可以仅使用日期搜索此字段 例如 2
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max
  • 如何使用 Alter Table 在 Access 中创建小数字段?

    我想以编程方式在 MS Access 表中创建一个新列 我尝试过很多排列ALTER TABLE MyTable Add MyField DECIMAL 9 4 NULL 并得到 字段定义中的语法错误 我可以轻松创建一个数字字段Double类
  • 将结构体数组传递给函数 C++

    抱歉这个菜鸟问题我只是有点困惑 如果我在 main 中有一个结构数组 我想将其传递给函数 struct MyStruct int a int b char c mayarray 5 MyStruct StructArray 10 myFun
  • 如何在oracle中获取表作为输出参数

    我正在尝试将 Oracle 过程调用的 out 参数强制转换为对象 它不起作用 因为 据我了解 我需要定义一个映射 它告诉方法如何转换它 如果地图为空或未正确填充 则它默认为 STRUCT 类型的对象 在我的情况下这是错误的 我已经构建了一
  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • C# 查询两个数据库的数据

    我目前有一个查询 我正在从两个不同的数据库获取数据 这些数据被附加到一个名为 accountbuys 的列表中 我的第一个表有三个数据条目 3个想要购买股票的帐户 下一张表有 17 个数据点 购买 17 只股票 I am merging t
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • 如何删除django中级联的一对一相关模型?

    背景 我在 Django 1 8 5 中定义了以下模型 class PublishInfo models Model pass class Book models Model info models OneToOneField Publis
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • sql脚本变量默认值

    我有一个脚本文件 例如测试 sql 我想从另一个脚本调用它 比如 caller sql 在 sqlcmd 模式下使用 r test sql 这工作正常 但我想在 test sql 中使用脚本变量 当我从 caller sql 调用 test
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID

随机推荐

  • Python - 多个 %s 字符串

    如何在 python 输出中使用多个 s TEXT Hi your first name is s Fname 这工作正常 但是 TEXT Hi your first name is s and your last name is s Fn
  • 从函数返回“本地”char* 与从函数返回“本地”int* 之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 局部变量的内存可以在其作用域之外访问吗 https stackoverflow com questions 6441218 can a local variables memory be access
  • 如何在 phpstorm 中禁用 SQL 代码的突出显示?

    如何在 phpstorm 中禁用 SQL 代码的突出显示 我曾经禁用过所有 sql 检查 但是颜色和字体规则仍然过于严格 我的 php 字符串颜色规则 这是我想要实现的目标的示例 var php all text here is red S
  • 视口单位 vw/vh/vmin/vmax 不支持缩放吗?

    As per 如何正确使用 css values viewport relative lengths https stackoverflow com questions 30175730 how to properly use css va
  • 将 Redis Streams 输出转换为 Pandas Dataframe

    会是什么fastest方法来转换一个Redis流 https redis io topics streams intro输出 aioredis 客户端 hiredis 解析器 到 Pandas Dataframe 其中 Redis 流 ID
  • 如何在 OS X 上重新启动 nginx

    我在用着nginx在 OS X 10 8 上 全新安装nginx但找不到重新启动 nginx 的方法 除了kill nginx pid say kill 64116 想知道是否有更好的重启方法nginx 在Google和SO上找到了一些方法
  • iPhone 使用证书加密

    我必须加密一个字符串 并在 xCode 项目的 Resources 文件夹中有一个 CER x 509 这两天我一直在想怎么做 但没有成功 所以是时候问一下了 Apple 的文档非常难以阅读 而且我认为这个框架可能是最难理解的框架 两个示例
  • React-ui-tree 对触摸设备的拖放支持

    我正在尝试为支持触摸的设备添加 DnD 支持反应 ui 树 https github com pqx react ui tree它的行为似乎很奇怪 虽然拖动似乎开始于触摸移动事件并突然停止 但如果你从同一个位置拾取并移动 那么事情似乎就会起
  • Java正则表达式以逗号分隔但忽略注释内的逗号

    我需要正则表达式用逗号 分割字符串 但忽略注释部分中的逗号 更改你的正则表达式后我尝试了很多 但没有成功 例如 Command RTRV EQPT Completion Code DENY Error Code II AC Problem
  • SQL Server:使用元组 IN 子句进行多重连接

    我正在尝试连接 4 个具有复杂关系的表 由于要使用它的位置 它需要包含在单个查询中 但我遇到了麻烦 因为主查询和 IN 子句查询都将 2 个表连接在一起 并且查找是在两列上进行的 目标是输入一个SalesNum and SalesType并
  • 使用 pygame.transform.rotate 时内存不足

    我写了一个脚本 允许用户控制老鹰的精灵飞来飞去以学习pygame 看起来很好 直到我实现了一个旋转函数 使精灵根据其飞行方向旋转 移动一小会儿后 精灵变得非常模糊 很快就会弹出一个错误 内存不足 在这一行 eagle img pygame
  • NullPointerException 但编译?

    我正在编写一个简单的命令行游戏 我已经有很多功能了 这里只发布必要的功能 问题 程序可以编译 但是当levelup 被呼叫并选择了一个号码 我得到这个 You have 5 skill points to spend What would
  • 实体子类的专用缓存区域?

    我们拥有一个包含 100 多个实体类的广泛实体模型 所有实体类都是单个实体超类的子类 共享缓存模式已设置为ALL Entity Inheritance strategy InheritanceType JOINED Table name e
  • 这是什么意思: qq = qq || {}? [复制]

    这个问题在这里已经有答案了 我已经下载了一个 JavaScript 脚本 第一行是 qq qq 这是什么意思 它检查qq对于预先存在的真实值 http 11heavens com falsy and truthy in javascript
  • 安装私有 Go 模块:未知修订错误

    我有一个私人 Go 存储库 位于https github com myorg myrepo被另一个 Go 存储库使用并定义在go mod 当我尝试跑步时 go mod tidy下载所有依赖项 它返回以下错误 go github com my
  • 处理400后运行时错误

    设想 用户名和密码使用 WebApi 2 令牌身份验证进行身份验证 如果凭据正确 则返回令牌 但是 如果凭据不正确 则会返回 400 bad request 在我的 Ionic 2 项目中 如果收到响应 我会导航到下一页 如果收到错误 我会
  • Java中使用Selenium快速获取每个WebElement的类属性

    我正在寻找每个的类属性WebElement用硒快速在页面上 目前 我正在执行以下操作 allElements new ArrayList
  • 当 setLabelsClipped 为 true 时,顶点标签在顶点外部、滚动条上和其他组件上绘制

    我使用 JGraph 一段时间了 当您将标签裁剪设置为 true 时 似乎存在绘画问题 下面的简化示例显示了您可能会遇到的实际应用程序中的问题 import java awt BorderLayout import java awt Dim
  • 在 MATLAB 中处理大型 CSV 文件

    我必须处理一个最大 2GB 的大 CSV 文件 更具体地说 我必须将所有这些数据上传到 mySQL 数据库 但在我必须对此进行一些计算之前 所以我需要在 MATLAB 中完成所有这些操作 我的主管也想在 MATLAB 中完成 因为他熟悉MA
  • 将嵌套 XML 数据与数据库表结构进行匹配的最快方法

    我有一个创建的应用程序datarequests这可能相当复杂 这些需要作为表存储在数据库中 一个轮廓datarequest 作为 XML 将是