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

10

我的应用程序经常需要使用查找表来获取各种代码的可读形式,以修饰它所提供的文档中的值。

例如 <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个回答

8

任何需要独立搜索的内容都应该成为自己的文档或片段。然而,如果你只是进行查找操作,则元素属性范围索引应该非常快速地返回值:

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

使用范围索引,无论你如何分块文档,查找都将在相同的索引上进行。所以,除非你需要使用 cts:search 在 product-code 上检索实际元素,否则如何分块文档都无关紧要。

7

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

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

这将返回哈希表的 XML 表示形式,可以使用 xdmp:document-insert 直接存储在数据库中。您可以使用 map:map 作为构造函数,将 XML 映射转换回本地映射。本地映射也可以使用 xdmp:set-server-field 进行缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接