2

我是 XML 数据库的新手,特别是,我正在尝试了解 Marklogic 的工作原理。如果这些问题太天真或太明显,我深表歉意。

我想做的是在 Marklogic 中实现 MongoDB 样式的文档引用,因为我认为该模式非常适用于后者,它本身就是一个面向文档的数据库。

这是 MongoDB 文档对手册和 DBRef 样式文档引用的说明:

http://docs.mongodb.org/manual/reference/database-references/

MongoDB 建议使用手动文档引用。

现在,我能看到的最直接的方法是将这条信息定义为,比如说,模式定义的一部分;从 objectid、书和出版商的定义开始:

<xs:simpleType name="objectId">
  <xs:restriction base="xs:string">
    <xs:length value="24"/>
    <xs:whiteSpace value="collapse"/>
  </xs:restriction>
</xs:simpleType>

<xs:element name="Publisher">
  <xs:complexType>
    <xs:attribute name="id" type="fbc:objectId" use="required"/>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="location" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

<xs:element name="Book">
  <xs:complexType>
    <xs:attribute name="Title" type="xs:string"/>
    <xs:attribute name="publisherId" type="fbc:objectId" use="required"/>
  </xs:complexType>
</xs:element>

所以三个问题:

  1. 这足以模拟一本书与其出版商之间的文档引用吗?对于基于模式的 XML 文档有更好的方法吗?

  2. 这种方法在 Marklogic(或任何其他 XML 数据库,如existDB、Senda 或 Basex)中执行 XQuery 时会带来困难吗?

  3. Marklogic 声明它可以使用“模块化文档”,其中包含使用 XPointer 和 XInclude 的某种类型的特殊文档引用:

    http://docs.marklogic.com/guide/app-dev/mod-docs

使用这种方法而不是手动文档参考有什么好处吗?是否有任何有效的 Java API 示例此功能?

如果这些问题太多,我提前道歉,但我相信它们都与此处所述的整体问题有关。谢谢。

更新:

我想我会在适当的地方进行一些数据反规范化,并在需要时使用普通的旧文档 URI 属性来引用其他文档。我猜这不是最好的方法,但我认为它在未来可能已经足够好了。我会不断更新我的发现。谢谢!

4

3 回答 3

2

正如 David 和 WST 所指出的,MarkLogic 强调非规范化而不是连接。存储数据结构树或结构化文本内容可以大规模检索具有高性能的文档。

也就是说,MarkLogic 确实支持连接。您可以使用 XInclude 聚合或仅使用其值为相关文档的文档 URI 的元素或属性。(链接方法类似于 HTML 中的链接。)此类链接可以由服务器上的 XQuery 解析,也可以在客户端通过使用单个查询检索相关文档来解析。

于 2013-08-14T02:20:20.423 回答
1

XMarkLogic http://docs.marklogic.com/guide/app-dev/mod-docs中包含的文档,即“模块化文档”

可以在展开后存储(如果您使用 CPF 框架,它实际上将存储组件和最终展开的文档)或在读取时展开。

如果您扩展阅读,关键的区别在于搜索功能在文档(或片段)的基础上进行搜索。对模块化文档的搜索不会在主文档上显示为匹配,而是在包含的文档上显示。我想这通常不是大多数基于搜索的应用程序想要的。但是如果你的应用不是基于搜索的,或者你可以考虑到这一点,你就可以利用这一点。

我一般会建议(即没有其他令人信服的理由)对您的数据进行非规范化,以使其全部适合一个原子文档。

-大卫

于 2013-08-13T23:24:00.720 回答
1

我认为最简单的方法是取消基于 ID 的关联,并将出版商名称和位置直接存储在每个图书文档中。否则,您仍然必须执行类似联接的操作,这会更昂贵。

当您需要的所有数据都已在文档中时,MarkLogic 的性能最佳。这通常意味着复制数据。这种策略在其他 XQuery 数据库中应该可以正常工作,但我不能确切地说它与 MarkLogic 相比有多优化。

MarkLogic 有一个非常广泛的白皮书,解释了它的索引系统和许多其他细节。这是了解如何设计最佳查询和数据的绝佳资源。此链接保留最新版本的副本:

http://developer.marklogic.com/inside-marklogic

于 2013-08-13T23:03:55.467 回答