2013-03-14 9 views
10

Moja aplikacja często potrzebuje do dekoracji wartości w dokumentach, którym służy za pomocą odnośnika do pobierania zabiorą czytelne dla człowieka formy różnych kodów.Co jest najbardziej wydajnym sposobem przechowywania pary nazwa/wartość w bazie danych Marklogic

Na przykład <product_code>PC001</product_code> chciałby być zwracane jako <product_code code='PC001'>Widgets</product_code>. Nie zawsze jest to kod produktu; istnieje kilka różnych typów kodu, które wymagają podobnego zachowania (niektóre z nich mają zaledwie kilkadziesiąt przykładów, niektóre z nich kilka tysięcy).

Co chcę wiedzieć, jaki jest najskuteczniejszy sposób przechowywania tego dane w bazie danych? Mogę myśleć o dwóch możliwości:

1) wpis od rodzaju kodu, z wielu elementów:

<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) Jeden dokument na kodzie, z których każda zawiera element <product-code> jak wyżej.

(Oczywiście, obie opcje obejmowałyby indeksy sensowne)

Czy którykolwiek z nich zauważalnie szybciej niż inne? Czy istnieje inna, lepsza opcja?

Mam wrażenie, że ogólnie lepiej jest zachować jedną "rzecz" w jednym dokumencie, ponieważ jest ona nieco bardziej czysta i (jak rozumiem) lepiej pasuje do indeksowania ML, ale w tym przypadku wydaje się, że doprowadziłoby to do bardzo dużej liczby bardzo małych plików. Czy to jest coś, o co powinienem się martwić?

Odpowiedz

8

Wszystko, co należy niezależnie przeszukać, powinno być jego własnym dokumentem lub fragmentem. Jednakże, jeśli jesteś po prostu robi wyszukiwań następnie element atrybut indeksu zakres powinien być bardzo szybko na wartości powracających:

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

Korzystanie indeks Zakres wyszukiwań będą wszystkie wystąpić z tego samego indeksu, niezależnie od tego jak kawałek dokumentów. Więc jeśli nie będziesz potrzebował używać cts: wyszukaj na product-code, aby odzyskać rzeczywiste elementy, nie powinno mieć znaczenia, jak fragmentujesz dokumenty.

6

Innym podejściem jest przechowywanie mapy reprezentującej pary nazwa-wartość.

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

ta zwraca reprezentację XML hashmap, które mogą być przechowywane bezpośrednio w bazie danych przy użyciu xdmp:document-insert. Możesz odwrócić mapę XML z powrotem na natywną mapę używając map:map jako funkcji konstruktora. Natywna mapa może również zostać zapamiętana przy użyciu xdmp:set-server-field.

Powiązane problemy