我的应用程序通常需要使用查找来修饰它所服务的文档中的值,以获取各种代码的可读形式。
例如,<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的索引,但在这种情况下,它似乎会导致非常大量的非常小的文件。那是我应该担心的吗?
答案 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
来记忆原生地图。