2013-03-14 6 views
10

Meine Anwendung muss oft Werte in den Dokumenten dekorieren, die sie bedient, mit einem Nachschlagetool, um lesbare Formulare verschiedener Codes abzurufen.Was ist die effizienteste Möglichkeit zum Speichern von Name/Wert-Paaren in einer Marklogic-Datenbank

Zum Beispiel <product_code>PC001</product_code> würde als <product_code code='PC001'>Widgets</product_code> zurückgegeben werden möchten. Es ist nicht immer product_code; Es gibt ein paar verschiedene Arten von Code, die ein ähnliches Verhalten benötigen (einige von ihnen haben nur ein paar Dutzend Beispiele, einige von ihnen ein paar tausend.)

Was ich wissen möchte ist, was ist die effizienteste Möglichkeit, das zu speichern Daten in der Datenbank? Ich kann mich zwei Möglichkeiten:

1) Ein Eintrag pro Codetyp, mit vielen Elementen:

<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) Ein Eintrag pro Code, wie oben ein <product-code> Element enthält.

(Offensichtlich würden beide Optionen sinnvoll Indizes)

entweder dieser deutlich schneller ist als die andere? Gibt es eine andere, bessere Option?

Mein Gefühl ist, dass es im Allgemeinen besser ist, ein "Ding" pro Dokument zu behalten, da es konzeptionell etwas sauberer und (ich verstehe) besser für die Indexierung von ML geeignet ist, aber in diesem Fall scheint es zu einer sehr großen Anzahl zu führen von sehr kleinen Dateien. Ist das etwas, worüber ich mich Sorgen machen sollte?

Antwort

8

Alles, was unabhängig durchsucht werden muss, sollte ein eigenes Dokument oder Fragment sein. Wenn Sie jedoch sind Lookups nur tun, dann sollte ein Element Attribut Entfernungs-Index bei der Rückkehr Wert sehr schnell sein:

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

einen Entfernungs-Index Verwenden der Lookups werden alle aus dem gleichen Index auftreten, unabhängig davon, wie Sie chunk die Dokumente. Also, es sei denn, Sie müssen cts: Suche auf product-code verwenden, um die tatsächlichen Elemente abzurufen, sollte es egal sein, wie Sie die Dokumente chunk.

6

Ein anderer Ansatz besteht darin, eine Zuordnung zu speichern, die die Name-Wert-Paare darstellt.

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

Dies gibt eine XML-Repräsentation des hashmap, die direkt in der Datenbank xdmp:document-insert Verwendung gespeichert werden können. Sie können eine XML-Map mithilfe von map:map als Konstruktorfunktion in eine native Map zurückverwandeln. Die native Karte könnte auch unter Verwendung von xdmp:set-server-field gespeichert werden.

Verwandte Themen