3

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は、非正規化されたテーブルに細断処理されてから、、、、、などの正規化されたテーブルに繰り返し書き込まtblDataTasktblFilterますtblSeries。これで結構です。

この問題は、特定のXML定義をDBにすでに保持されているものと一致させたい場合に発生します。私は現在これを...

  • XMLを非正規化されたテーブルに細断処理す​​る
  • CTEを使用して、データベース内の既存のすべてのデータを同じ非正規化形式にプルします
  • WHERE巨大な条件(34行長)を使用したマッチング

..これにより、指定されたXMLと完全に一致するDataRequestIDが返されます。この方法は非常に遅くなるのではないかと心配しています。CTEが巧妙なフィルタリングを行うとは思わないため、巨大なデータを適用する前にWHERE毎回すべてのデータを取得します。

私はこれにもっと良い解決策があるに違いないと思った例えば

  • を保存するときdatarequestは、datarequestのハッシュも何らかの方法で保存し、それに一致させます。衝突の場合は、現在の方法を使用してください。ただし、set-logicを使用してこれを実行したかったのです。また、ハッシュを変更するXMLの無関係な小さな違い(スプリアススペースなど)についても心配しています。
  • どういうわけか、ボトムアップから繰り返しマッチングを実行します。たとえば、最低レベルで一致するフィルターのリストを作成します。これをtomatchSeriesの一部として使用しINます。INこれをDataTasksなどに一致させるための一部として使用します。問題は、これについて考えるのが長すぎると、ブラックアウトし始めることです。

基本的に-誰かが以前にこの種の問題に遭遇したことがあります(彼らは持っている必要があります)。そして、それに取り組むための推奨ルートは何でしょうか?例の(擬似)コードは素晴らしいでしょう:)

4

1 に答える 1

1

小さな差異の可能性を取り除くために、XML変換(XSLT)を介してリクエストを実行します。

または、これを非正規化されたステージングテーブルに解析するコードがすでにあるので、これも問題ありません。次に、FORXMLを使用て新しいXMLドキュメントを作成します。

ここでの目標は、適切な場合は順序付けを尊重し、そうでない場合は不整合を取り除く、標準化されたXMLドキュメントを作成することです。

それが完了したら、これを新しいテーブルに保存します。これで、「標準化された」リクエストXMLを既存のデータと直接比較できます。

実際の比較を行うには、ハッシュを使用するか、XMLを文字列として保存して直接文字列比較を行うか、次のように完全なXML比較を行います。http://beyondrelational.com/modules/2/blogs/28/投稿/10317/xquery-lab-36-writing-a-tsql-function-to-compare-two-xml-values-part-2.aspx

XMLが8000バイトを超えない限り、私の好みは、一意の文字列(特殊文字をサポートしている場合はVARCHAR(8000)またはNVARCHAR(4000))を作成し、列に一意のインデックスを作成することです。

于 2013-07-25T15:01:51.527 に答える