2013-03-14 15 views
10

La mia applicazione spesso ha bisogno di decorare i valori nei documenti che serve utilizzando una take di ricerca per recuperare forme leggibili da umani di vari codici.Qual è il modo più efficiente per memorizzare coppie nome/valore in un database Marklogic

Ad esempio <product_code>PC001</product_code> si desidera restituire come <product_code code='PC001'>Widgets</product_code>. Non è sempre product_code; ci sono alcuni diversi tipi di codice che richiedono un comportamento simile (alcuni di loro hanno solo poche decine di esempi, alcuni di essi qualche migliaio.)

Quello che voglio sapere è qual è il modo più efficiente per archiviare quello dati nel database? Posso pensare due possibilità:

1) un documento per tipo di codice, con molti elementi:

<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) un documento per il codice, ciascuna contenente un elemento <product-code> come sopra.

(Ovviamente, entrambe le opzioni sarebbero includono indici sensibili)

È uno di questi notevolmente più veloce rispetto agli altri? C'è un'altra opzione migliore?

La mia sensazione è che generalmente è meglio mantenere una "cosa" per documento poiché è concettualmente un po 'più pulito e (capisco) più adatto all'indicizzazione di ML, ma in questo caso sembra che porterebbe a un numero molto grande di file molto piccoli. È qualcosa di cui dovrei preoccuparmi?

risposta

8

Tutto ciò che deve essere ricercato in modo indipendente dovrebbe essere il proprio documento o frammento. Tuttavia, se si sta solo facendo le ricerche poi un attributo indice di gamma elemento dovrebbe essere molto veloce a valori di ritorno:

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

Utilizzando un indice di gamma le ricerche saranno tutti verificarsi lo stesso indice indipendentemente da come si pezzo i documenti. Quindi, a meno che non sia necessario utilizzare cts: cerca su product-code per recuperare gli elementi effettivi, non dovrebbe importare come blocchi i documenti.

6

Un altro approccio è quello di memorizzare una mappa che rappresenta le coppie nome-valore.

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

Questo restituisce una rappresentazione XML del HashMap, che possono essere memorizzati direttamente nel database utilizzando xdmp:document-insert. Puoi trasformare una mappa XML in una mappa nativa usando map:map come funzione di costruzione. La mappa nativa potrebbe anche essere memoized utilizzando xdmp:set-server-field.

Problemi correlati