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

Posted

技术标签:

【中文标题】在 Marklogic 数据库中存储名称/值对的最有效方法是啥【英文标题】:What is the most efficient way to store name/value pairs in a Marklogic database在 Marklogic 数据库中存储名称/值对的最有效方法是什么 【发布时间】:2013-03-03 04:37:52 【问题描述】:

我的应用程序经常需要在它所服务的文档中装饰值,使用查找获取各种代码的人类可读形式。

例如,<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) 每个代码一个文档,每个包含一个&lt;product-code&gt; 元素,如上。

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

其中任何一个明显比另一个快吗?还有其他更好的选择吗?

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于在 Marklogic 数据库中存储名称/值对的最有效方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

存储键值对的最佳 Java 数据结构 [重复]

使用名称值对的 Android volley post 请求

如何为具有不同数量的键/值对的对象添加类型? [关闭]

JSON详解

Alamofire 是不是支持结构化为有序值列表的 JSON?参数为 [String: Any],仅符合名称/值对的集合