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

时间:2014-01-13 16:04:36

标签: mongodb orientdb document-database

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

class User
{
    string Name
    List<Achievement> Achievements
}

Achievement是一个任意类(其内容与此示例无关)。

如果我要使用链接文档保存此内容,我会将User保存在Users集合中,并将Achievement保存在Achievements集合中,其中包含用户链接的成就列表{{1 Achievements集合中的对象。这需要在数据库引擎本身中进行某种连接过程。但是,如果您使用嵌入式文档,则只需将Achievement保存在“成就”位于User文档中的“用户”集合中。

嵌入式文档的数据的JSON表示将(大致)看起来像这样:

User

链接文档可能如下所示:     {         “名字”:“约翰Q纳税人”,         “成就”:             [                 “somelink1”,“somelink2”             ]     }

成就集内     {         “somelink1”:             {                 “名字”:“高分”,                 “点”:10000             }         “somelink2”:             {                 “名字”:“高分”,                 “点”:10000             }     }

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

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

您可以在此处阅读阻抗不匹配:http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch

<强>更新

我应该补充一点,从一开始就选择合适的数据库来满足您的需求是非常重要的。如果您对每个数据库有很多疑问,那么联系每个供应商并获取他们的一些培训材料可能是有意义的。 MongoDB提供2个免费课程,您可以在MongoDB University了解有关其产品和最佳用途的更多信息。 OrientDB确实提供培训,但它不是免费的。最好尝试直接联系他们并获得某种售前培训(如果您希望获得数据库许可),通常他们会让您联系某种售前顾问以帮助您评估他们的产品

答案 1 :(得分:2)

MongoDB的工作方式与RDBMS类似,其中对象id就像一个外键。这意味着“JOIN”运行时很昂贵。相反,OrientDB具有仅创建一次并且运行时成本非常低的直接链接。