针对 ODBC 支持的 NoSQL 文档存储的关系行为

Relational behavior against a NoSQL document store for ODBC support

第一个断言是文档样式的 nosql 数据库,如 MarkLogic 和 Mongo 应该将每条信息存储在一个 nested/complex 对象中。

考虑以下模型

<patient>
    <patientid>1000</patientid>
    <firstname>Johnny</firstname>
    <claim>
        <claimid>1</claimid>
        <claimdate>2015-01-02</claimdate>
        <charge><amount>100</amount><code>374.3</code></charge>
        <charge><amount>200</amount><code>784.3</code></charge>
    </claim>
    <claim>
        <claimid>2</claimid>
        <claimdate>2015-02-02</claimdate>
        <charge><amount>300</amount><code>372.2</code></charge>
        <charge><amount>400</amount><code>783.1</code></charge>
    </claim>
</patient>

在关系世界中,这将被建模为患者 table、索赔 table 和索赔费用 table。

我们的主要愿望是同时向下游应用程序提供这些数据,同时对其进行分析。由于我们不想为每个度量编写一个复杂的程序,我们应该能够在此之上放置一个工具。例如,Tableau 声称通过 ODBC 与 MarkLogic 建立了本地连接。

当我们在文档模型上使用范围索引创建视图时,SQL 在 MarkLogic return 中反对它的过度重复结果。电荷数也用求和函数重复计算。没用。

想法是通过MarkLogic的这些索引、视图和可能的片段技术,我们可以定义一个类似于关系结构的语义层。

文档提示您应该为每个 table 创建 1 个对象,但这似乎违背了首选的文档数据库结构。

存储大量文档数据然后在其上提供交钥匙分析工具的数据建模和应用程序模式是什么?

如果 ODBC 连接总是 return 错误数据并且不知道关系,那么所有声称具有 ODBC 支持的工具都反对 SQL 是不正确的。

参考资料

https://docs.marklogic.com/guide/sql/setup

https://docs.marklogic.com/guide/sql/tableau

http://www.marklogic.com/press-releases/marklogic-and-tableau-build-connection/

https://developer.marklogic.com/learn/arch/data-model

我想 MarkLogic 与其他文档存储相比有点不典型。当您不将整个 table 存储为一个文档,而是每个文档一条记录时,它的效果最好。 MarkLogic 索引针对这种方法进行了优化,并以这种方式轻松处理数百万文档的搜索。您会发现,只要将记录存储为文档,Tableau 中的结果就会大大改善。

将文档拆分成如此小的片段还可以实现更高的性能和更少的占用空间。 MarkLogic 不会将数据保存为允许随机访问的持久 DOM 树。相反,它以一种非常有效的方式流式传输数据,并依靠索引解析来快速提取相关片段..

HTH!

对于你的问题:"What is the data modeling and application pattern to store large amounts of document data and then provide a turnkey analytics tool on top of it?"

我使用的经验法则是,当我想计算 "objects" 时,我将它们建模为单独的文档。因此,如果您想要 运行 对患者、索赔和费用进行计数的查询,您可以将它们放在单独的文档中。

这并不意味着我们将 MarkLogic 限制为仅关系模式。在 UML 术语中,一对多关系可以是组合或聚合。在关系模型中,我别无选择,只能将它们建模为单独的 table。但在文档模型中,我可以为每个对象创建单独的文档或将它们全部组合在一起——选择通常基于我想要查询数据的方式。

所以您的第一个断言部分正确 - 在文档存储中,您可以选择嵌套所有相关数据,但您不必这样做。另请注意,由于 MarkLogic 与模式无关,因此随着需求的变化可以直接转换数据(corb 是一个很好的选择)。某些要求可能需要反规范化以帮助搜索 运行 高效。

简要示例 - 一个人可以有多个名字(别名、娘家姓)和多个地址(不同的家庭、工作地址)。在关系模型中,我需要一个人 table、一个名字 table 和一个地址 table。但我认为名字是一种复合关系——名字的生命周期等于人的生命周期——所以我宁愿将这些名字嵌套到个人文档中。地址 OTOH 有一个独立于人的生命周期,所以我会把它做成一个地址文档,然后将一个元素扔到每个相关地址的人文档上。从分析的角度来看,我现在可以问很多关于人和他们的名字,以及人和地址的有趣问题——我只是无法有效地计算名字,因为名字不在单独的文档中。