Cách hiệu quả nhất để lưu trữ các cặp tên / giá trị trong cơ sở dữ liệu Marklogic là gì (What is the most efficient way to store name/value pairs in a Marklogic database)


問題描述

Cách hiệu quả nhất để lưu trữ các cặp tên / giá trị trong cơ sở dữ liệu Marklogic là gì (What is the most efficient way to store name/value pairs in a Marklogic database)

My application often needs to decorate values in the documents it serves using a lookup take to fetch human readable forms of various codes.

For example <product_code>PC001</product_code> would want to be returned as <product_code code='PC001'>Widgets</product_code>. It's not always product_code; there are a few different types of code that need similar behaviour (some of them having just a few dozen examples, some of them a few thousand.)

What I want to know is what is the most efficient way to store that data in the database? I can think of two possibilities:

1) One document per code type, with many elements:

<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) One document per code, each containing a <product‑code> element as above.

(Obviously, both options would include sensible indexes)

Is either of these noticeably faster than the other? Is there another, better option?

My feeling is that it's generally better to keep one 'thing' per document since it's conceptually slightly cleaner and (I understand) better suited to ML's indexing, but in this case that seems like it would lead to a very large number of very small files. Is that something I should worry about?


參考解法

方法 1:

Anything that needs to be searched independently should be its own document or fragment. However, if you are just doing lookups then an element attribute range index should be very fast at returning values: 

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

Using a range index the lookups will all occur from the same index regardless of how you chunk the documents. So unless you will need to use cts:search on product‑code to retrieve the actual elements, it shouldn't matter how you chunk the documents. 

方法 2:

Another approach is to store a map that represents the name‑value pairs.

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

This returns an XML representation of the hashmap, which can be stored directly in the database using xdmp:document‑insert. You can turn an XML map back into a native map using map:map as a constructor function. The native map could also be memoized using xdmp:set‑server‑field.

(by Will Goringwstmblakele)

參考文件

  1. What is the most efficient way to store name/value pairs in a Marklogic database (CC BY‑SA 3.0/4.0)

#marklogic #xquery #xml






相關問題

Marklogic 是否有 liquibase 等價物 (Is there a liquibase equivalent for Marklogic)

Cách hiệu quả nhất để lưu trữ các cặp tên / giá trị trong cơ sở dữ liệu Marklogic là gì (What is the most efficient way to store name/value pairs in a Marklogic database)

對特定用戶隱藏 marklogic 數據庫(權限) (Hide a marklogic database to specific user (permissions))

在 marklogic 中使用 xquery 返回搜索結果 (Returning search results using xquery in marklogic)

創建僅對給定數據庫具有權限的用戶 (Create user that has permission only to given database)

Marklogic Java API 語義三重搜索 (Marklogic Java API Semantic Triple Search)

marklogic mlcp 自定義轉換將聚合文檔拆分為多個文件 (marklogic mlcp custom transform split aggregate document to multiple files)

如果某些文檔具有空值元素,則在日期字段上使用 element-range-query 搜索 (Search with element-range-query on date field if some of the documents have empty-value elements)

使用 MarkLogic 節點 API,我可以通過 LDAP 進行身份驗證嗎? (Using the MarkLogic Node API, can I authenticate through LDAP?)

如何使用 xdmp:node-insert 在 Marklogic 的 JSON 文檔中插入節點 (how to insert node in JSON doc in Marklogic using xdmp:node-insert)

我們可以在不同版本的 marklogic 之間進行森林或數據複製嗎? (Can we have forests or data replication between different versions of marklogic?)

換行在 XQuery 的行尾留下額外的空間 (Line feed leaving extra space at end of line in XQuery)







留言討論