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

时间:2013-03-14 17:16:14

标签: 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>

2)每个代码一个文档,每个文档包含一个<product-code>元素。

(显然,这两个选项都包括合理的索引)

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

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

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:7)

另一种方法是存储代表名称 - 值对的地图。

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

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