我有一个创建的应用程序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 定义与已保存在 DB 中的定义匹配时,就会出现问题。我目前通过...
- 将 XML 分解为非规范化表
- 使用 CTE 将数据库中的所有现有数据提取到相同的非规范化形式中
- 使用巨大的
WHERE
条件匹配(34 行长)
..这将返回与给定 XML 完全匹配的任何 DataRequestID。我担心这种方法最终会变得非常缓慢——部分原因是我不相信 CTE 会做任何巧妙的过滤,它会在每次应用巨大的WHERE
.
我认为必须有更好的解决方案,例如
- 在存储 a 时
datarequest
,还要以某种方式存储 datarequest 的哈希值,然后简单地匹配它。在发生碰撞的情况下,使用当前方法。但是,我想使用 set-logic 来做到这一点。而且,我担心 XML 中无关紧要的小差异会改变散列 - 虚假空间等。 - 不知何故,从下往上迭代地执行匹配。例如,生成在最低级别匹配的过滤器列表。将其用作
IN
匹配系列的一部分。使用它作为IN
匹配 DataTasks 等的一部分。问题是,当我考虑这个太久时,我开始昏迷。
基本上 - 以前有没有人遇到过这种问题(他们必须有)。解决它的推荐路线是什么?示例(伪)代码会很棒:)