mongodb - 文档数据库中的链接与引用

标签 mongodb orientdb document-database

我对连接文档的术语“链接”感到困惑

在 OrientDB 页面中 http://www.orientechnologies.com/orientdb-vs-mongodb/它指出他们使用链接来连接文档,而在 MongoDB 中文档是嵌入的。

因为在 MongoDB 中 http://docs.mongodb.org/manual/core/data-modeling-introduction/ , 文档也可以被引用,我无法区分链接文档和引用文档。

最佳答案

面向文档的数据库的目标是减少“阻抗不匹配”,这是数据被分割以匹配运行时驻留在内存中的实际对象的某种数据库模式的程度。通过使用文档,整个对象被序列化到磁盘,而无需将内容拆分到多个表中并在检索时将它们重新连接在一起。

也就是说,链接文档与引用文档相同。它们只是说同一件事的两种方式。这些链接在查询时如何解析因数据库实现而异。

话虽这么说,嵌入式文档只是在父级内部存储以某种方式与父级类型相关的对象类型的行为。比如我有一个类如下:

class User
{
    string Name
    List<Achievement> Achievements
}

其中 Achievement 是一个任意类(其内容对于本示例无关紧要)。

如果我要使用链接文档保存它,我会将 User 保存在 Users 集合中,将 Achievement 保存在 Achievements 集合中,其中包含用户的成就列表链接到 Achievements 集合中的 Achievement 对象。这需要在数据库引擎本身中发生某种连接过程。但是,如果您使用嵌入式文档,您只需将 User 保存在 Users 集合中,其中 Achievements 位于 User 文档中。

嵌入式文档数据的 JSON 表示(大致)如下所示:

{
    "name":"John Q Taxpayer",
    "achievements":
        [
            {
                "name":"High Score",
                "point":10000
            },
            {
                "name":"Low Score",
                "point":-10000
            }
        ]
}

而链接文档可能看起来像这样: { "name":"John Q 纳税人", “成就”: [ “somelink1”,“somelink2” ]

在成就收藏中 { “somelink1”: { "name":"高分", “点”:10000 } “somelink2”: { "name":"高分", “点”:10000 }

请记住,这些只是近似表示。

总而言之,链接文档的功能很像 RDBMS PK/FK 关系。这允许一个集合中的多个文档引用另一个集合中的单个文档,这有助于对存储的数据进行重复数据删除。然而,它增加了一层复杂性,要​​求数据库引擎进行多次磁盘 I/O 调用以形成最终文档返回给用户代码。嵌入式文档与内存中的对象更匹配,这减少了阻抗不匹配并且(理论上)减少了磁盘 I/O 调用的次数。

您可以在这里阅读阻抗失配:http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch

更新

我应该补充一点,从一开始就根据您的需要选择合适的数据库来实现非常重要。如果您对每个数据库有很多问题,联系每个供应商并获得他们的一些培训 Material 可能是有意义的。 MongoDB 提供 2 门免费类(class),您可以在 MongoDB University 上学习更多关于其产品和最佳用途的信息。 . OrientDB 确实提供培训,但不是免费的。最好尝试直接与他们联系并获得某种售前培训(如果您希望获得数据库许可),通常他们会让您与某种售前顾问联系以帮助您评估他们的产品.

关于mongodb - 文档数据库中的链接与引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095809/

相关文章:

node.js - MongoError : Connection Closed By Application using node. js驱动程序

orientdb - 无法在 OrientDB Studio 中使用 gremlin

nosql - 我是否缺少有关文档数据库的内容?

azure - 如何使用 CosmosDB 对用户权限数据进行分区

mongodb - 文档数据库中的多对多

mongodb - meteor restivus 端点配置

MongoDB概念直接访问文件或访问导入数据(访问RAW数据)

java - 运行嵌入式服务器时 OrientDb 端口范围的用途是什么?

ruby - 更改 mongoid 关系的名称 (embeds_...,belongs_to,has_...)

java - 使用嵌入式 OrientDB 实例是多线程环境