10

私のアプリケーションでは、ルックアップ テイクを使用して提供するドキュメントの値を装飾し、さまざまなコードの人間が判読できる形式を取得する必要があることがよくあります。

たとえば、<product_code>PC001</product_code>として返され<product_code code='PC001'>Widgets</product_code>ます。常に product_code であるとは限りません。同様の動作を必要とするいくつかの異なるタイプのコードがあります (いくつかは数十の例しかないものもあれば、数千の例もあります)。

私が知りたいのは、そのデータをデータベースに保存する最も効率的な方法は何ですか? 次の 2 つの可能性が考えられます。

1) 多くの要素を含む、コード タイプごとに 1 つのドキュメント:

<product-codes>
  <product-code code = "PC001">Widgets</product-code>
  <product-code code = "PC002">Wodgets</product-code>
  <product-code code = "PC003">Wudgets</product-code>
</product-codes>

2) コードごとに 1 つのドキュメント。それぞれ<product-code>に上記の要素が含まれます。

(明らかに、どちらのオプションにも賢明なインデックスが含まれます)

これらのどちらかが他のものより著しく高速ですか? 別のより良いオプションはありますか?

概念的には少しクリーンで、(私は理解しています) ML のインデックス作成により適しているため、ドキュメントごとに 1 つの「もの」を保持する方が一般的には良いと思いますが、この場合、非常に多数の非常に小さなファイルにつながるように思われます。 . それは私が心配すべきことですか?

4

2 に答える 2

8

個別に検索する必要があるものはすべて、独自のドキュメントまたはフラグメントである必要があります。ただし、ルックアップを実行しているだけの場合は、要素属性範囲インデックスの戻り値が非常に高速である必要があります。

element-attribute-range-query(xs:QName('product-code'), xs:QName('code'), '=', 'PC001') 
=> 
Widgets

範囲インデックスを使用すると、ドキュメントのチャンク方法に関係なく、すべて同じインデックスからルックアップが実行されます。したがって、実際の要素を取得するためにcts:search onを使用する必要がない限りproduct-code、ドキュメントをどのようにチャンク化するかは重要ではありません。

于 2013-03-14T17:27:26.837 に答える
7

別のアプローチは、名前と値のペアを表すマップを格納することです。

let $m := map:map()
let $_ := map:put($m, 'a', 'fubar')
return document { $m }

これにより、ハッシュマップのXML表現が返されます。これは、を使用してデータベースに直接保存できますxdmp:document-insertmap:mapコンストラクター関数として使用して、XMLマップをネイティブマップに戻すことができます。ネイティブマップは、を使用してメモ化することもできますxdmp:set-server-field

于 2013-03-14T20:23:09.350 に答える