在Marklogic数据库中存储名称/值对的最有效方法是什么

Wil*_*ing 10 xml xquery 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>
Run Code Online (Sandbox Code Playgroud)

2)每个代码一个文档,每个文档包含一个<product-code>如上所述的元素.

(显然,两种选择都包括合理的指数)

这些中的任何一个明显比另一个快吗?还有另一种更好的选择吗?

我的感觉是,每个文档保留一个"东西"通常会更好,因为它在概念上稍微清晰一些(我理解)更适合ML的索引,但在这种情况下,它似乎会导致非常大量的非常小的文件.那是我应该担心的吗?

wst*_*wst 8

任何需要独立搜索的内容都应该是自己的文档或片段.但是,如果您只是在进行查找,那么元素属性范围索引在返回值时应该非常快:

element-attribute-range-query(xs:QName('product-code'), xs:QName('code'), '=', 'PC001') 
=> 
Widgets
Run Code Online (Sandbox Code Playgroud)

使用范围索引,无论您如何分块文档,查找都将从同一索引发生.因此,除非你需要使用cts:search on product-code来检索实际的元素,否则你应该如何分块文档.


mbl*_*ele 7

另一种方法是存储表示名称 - 值对的映射.

let $m := map:map()
let $_ := map:put($m, 'a', 'fubar')
return document { $m }
Run Code Online (Sandbox Code Playgroud)

这将返回hashmap的XML表示形式,可以使用它直接存储在数据库中xdmp:document-insert.您可以使用map:map构造函数将XML映射转换回本机映射.原生地图也可以使用记忆xdmp:set-server-field.