datarequests
非常に複雑になる可能性のある作成するアプリケーションがあります。これらは、テーブルとしてデータベースに保存する必要があります。(XMLとしての)アウトラインはdatarequest
...
<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
内である場合を除きますdatefilter
。
しかし、これの構造は一種の学術的であり、問題はより根本的です。
要求が届くと、このようなXMLがストアドプロシージャへのパラメーターとしてSQLServerに送信されます。tblDataRequest (DataRequestID PK)
このXMLは、非正規化されたテーブルに細断処理されてから、、、、、などの正規化されたテーブルに繰り返し書き込まtblDataTask
れtblFilter
ますtblSeries
。これで結構です。
この問題は、特定のXML定義をDBにすでに保持されているものと一致させたい場合に発生します。私は現在これを...
- XMLを非正規化されたテーブルに細断処理する
- CTEを使用して、データベース内の既存のすべてのデータを同じ非正規化形式にプルします
WHERE
巨大な条件(34行長)を使用したマッチング
..これにより、指定されたXMLと完全に一致するDataRequestIDが返されます。この方法は非常に遅くなるのではないかと心配しています。CTEが巧妙なフィルタリングを行うとは思わないため、巨大なデータを適用する前にWHERE
毎回すべてのデータを取得します。
私はこれにもっと良い解決策があるに違いないと思った例えば
- を保存するとき
datarequest
は、datarequestのハッシュも何らかの方法で保存し、それに一致させます。衝突の場合は、現在の方法を使用してください。ただし、set-logicを使用してこれを実行したかったのです。また、ハッシュを変更するXMLの無関係な小さな違い(スプリアススペースなど)についても心配しています。 - どういうわけか、ボトムアップから繰り返しマッチングを実行します。たとえば、最低レベルで一致するフィルターのリストを作成します。これをtomatchSeriesの一部として使用し
IN
ます。IN
これをDataTasksなどに一致させるための一部として使用します。問題は、これについて考えるのが長すぎると、ブラックアウトし始めることです。
基本的に-誰かが以前にこの種の問題に遭遇したことがあります(彼らは持っている必要があります)。そして、それに取り組むための推奨ルートは何でしょうか?例の(擬似)コードは素晴らしいでしょう:)