Каков наиболее эффективный способ хранения пар имя/значение в базе данных 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.