将嵌套 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 数据与数据库表结构进行匹配的最快方法 的相关文章

  • 插入后用触发器更新多行(sql server)

    我有一个表 orderDetails 包含订单的产品 产品编号 color size quantity 和一个表库存 产品编号 size color stock 订单完成后 我使用此查询将项目插入表中orderDetails INSERT
  • 通过货币换算获取每种产品类型的最低价格

    我想选择每种产品类型中最便宜的 包括运费 价格转换为当地货币 最便宜 产品 价格 产品 运费 seller to aud 我的数据库有如下表 PRODUCTS SELLERS id type id seller id price shipp
  • 使用 SQL Filestream 时出现 OutOfMemoryException

    我正在尝试将大约 600 MB 的 zip 文件上传到 SQL 2008 FILESTREAM 表 但出现 OutOfMemoryException 我正在使用 SqlFileStream 类上传文件 如本教程中所述 http www ag
  • SqlCommand 参数与 String.Format [重复]

    这个问题在这里已经有答案了 我一直在互联网上搜索 但似乎找不到任何可以解释我的问题的内容 可能是我没有使用正确的搜索字符串 所以我在这里发帖希望有人可以帮助我有了这个 我的程序是使用Visual Studio 2010用C 编写的 我注意到
  • 如何在sqlite中创建物化视图?

    我对物化视图和 SQLite 进行了无数次搜索 据我所知 2004 年和 2006 年似乎有人提到 SQLite 没有物化视图 紧随其后的是 SQLite 的变更日志2008年3月 http www sqlite org releaselo
  • 使用 WHILE 创建虚拟数据

    我尝试使用 a 在表中插入一些虚拟数据WHILE 但它运行得非常非常慢 我在想也许我写的代码不正确 你能看一下并确认一下吗 Insert dummy data DECLARE i int Content int SET i 5001 WHI
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • Fluent NHibernate 中的 NHibernate 配置属性

    我正在考虑在我的项目中使用 Fluent NHibernate 但我还没有找到任何关于 FH 是否支持 NHibernate 设置 例如 show sql 和prepare sql 的文档 我可以在紧要关头没有 show sql 生活 但p
  • 将两行中相似的列数据合并到一行中

    我的查询结果具有以下特征 LIDCode Total Domain Region VSE Version AB02 15 GLOBAL CANLA 0 6943 AB02 5925 CENTRE STREET SW 31 GLOBAL CA
  • 创建表作为 select 删除 postgresql 中的非空约束

    在 postgres sql 中 创建表时 select 删除了表上的非空约束 例如 对此没有单一命令的解决方案 要基于现有表 包括所有约束 创建表 请使用 create table B like a including constrain
  • postgres 有 CLOSEST 运算符吗?

    我正在寻找这样的东西 给定一个表格 id number 1 7 2 1 25 3 1 01 4 3 0 查询SELECT FROM my table WHEREnumberCLOSEST 1 将返回第 3 行 我只关心数字 现在我有一个程序
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N

随机推荐

  • 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 将是