在XML数据库中实现MongoDB样式文档引用

时间:2013-08-13 22:48:35

标签: mongodb database-design xsd marklogic

我是XML数据库的新手,特别是我正在努力学习Marklogic的工作原理。如果这些问题太天真或太明显,我道歉。

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

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

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

MongoDB建议使用手动文档参考。

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

<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. 这是否足以模拟图书与其出版商之间的文档参考?对于基于Schema的XML文档是否有更好的方法?

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

  3. Marklogic声明它可以使用“模块化文档”,它使用XPointer和XInclude来保存某些类型的特殊文档引用:

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

  4. 使用该方法代替手动文档引用是否有任何优势?这个功能是否有任何可用的Java API示例?

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

    更新

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

3 个答案:

答案 0 :(得分:2)

正如David和WST指出的那样,MarkLogic强调对连接进行非规范化。存储数据结构树或结构化文本内容使得可以大规模地检索具有高性能的文档。

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

答案 1 :(得分:1)

我认为最简单的方法是取消基于ID的关联,并将发布者名称和位置直接存储在每本书籍文档中。否则你仍然需要执行类似连接的操作,这种操作更加昂贵。

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

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

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

答案 2 :(得分:1)

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

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

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

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

-David