Каков наиболее эффективный способ хранения пар имя/значение в базе данных Marklogic
Мое приложение часто должно украшать значения в документах, которые он служит, используя поиск, чтобы извлекать человекообразные формы различных кодов.
Например, <product_code>PC001</product_code>
хотел бы быть возвращен как <product_code code='PC001'>Widgets</product_code>
. Это не всегда product_code; существует несколько разных типов кода, которые нуждаются в подобном поведении (некоторые из них имеют всего несколько десятков примеров, некоторые из них - несколько тысяч.)
Что я хочу знать, является наиболее эффективным способом хранения этих данных в базе данных? Я могу представить две возможности:
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) Один документ на каждый код, содержащий элемент <product-code>
, как указано выше.
(Очевидно, что оба варианта будут включать в себя разумные индексы)
Является ли это либо быстрее, чем другим? Есть ли другой, лучший вариант?
Я чувствую, что лучше всего держать одну вещь на одном документе, поскольку она концептуально немного чище и (я понимаю) лучше подходит для индексации ML, но в этом случае похоже, что это приведет к очень большому числу очень маленькие файлы. Это то, о чем я должен беспокоиться?
Ответы
Ответ 1
Все, что нужно искать независимо, должно быть его собственным документом или фрагментом. Однако, если вы просто выполняете поиск, тогда индекс значений атрибута элемента должен быть очень быстрым при возвращении значений:
element-attribute-range-query(xs:QName('product-code'), xs:QName('code'), '=', 'PC001')
=>
Widgets
Используя индекс диапазона, поиск будет происходить из одного индекса независимо от того, как вы обмениваете документы. Поэтому, если вам не понадобится использовать cts: поиск в product-code
для извлечения фактических элементов, не имеет значения, как вы обрезаете документы.
Ответ 2
Другим подходом является сохранение карты, представляющей пары имя-значение.
let $m := map:map()
let $_ := map:put($m, 'a', 'fubar')
return document { $m }
Это возвращает XML-представление хэш-карты, которое может быть сохранено непосредственно в базе данных с помощью xdmp:document-insert
. Вы можете превратить карту XML обратно в нативную карту, используя map:map
в качестве функции-конструктора. Нативная карта также может быть сохранена с помощью xdmp:set-server-field
.