2013-03-14 15 views
10

私のアプリケーションでは、人間が読める形式のさまざまなコードを取得するために、ルックアップテイクを使って値を装飾する必要があります。Marklogicデータベースに名前と値のペアを格納する最も効率的な方法

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

私が知りたいのは、データベースのデータ?

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>元素を含む私は2つの可能性を考えることができます。

(もちろん、両方のオプションが賢明なインデックスが含まれます)

他よりも著しく速くこれらのいずれかですか?別の、より良い選択肢がありますか?

概念的には少し洗練されていて、MLの索引作成に適しているので(なぜなら)、非常に大きな数非常に小さいファイルのそれは私が心配すべきことですか?

答えて

8

独立して検索する必要があるものは、それ自体のドキュメントまたは断片である必要があります。あなただけの検索を行っている場合は、その要素の属性の範囲のインデックスは、返却値に非常に高速である必要があります:

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

検索はすべて同じインデックスから発生します範囲索引を使用するに関係なく、どのようにチャンクの文書の。したがって、実際の要素を取得するためにproduct-codeでcts:searchを使用する必要がない場合は、ドキュメントをどのようにチャンクしても問題ありません。

6

もう1つの方法は、名前と値のペアを表すマップを保存することです。

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

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

関連する問題