我对连接文档的术语"链接"感到困惑
在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集合中,其中包含用户链接到Achievement
Achievements集合中对象的成就列表.这需要在数据库引擎本身中进行某种连接过程.但是,如果您使用嵌入式文档,则只需将" User
成就" 保存在文档中的"用户"集合中User
.
嵌入式文档的数据的JSON表示将(大致)看起来像这样:
{ "name":"John Q Taxpayer", "achievements": [ { "name":"High Score", "point":10000 }, { "name":"Low Score", "point":-10000 } ] }
鉴于链接文档可能如下所示:{"name":"John Q Taxpayer","achievement":["somelink1","somelink2"]}
成就集合内部{"somelink1":{"name":"高分","点":10000}"somelink2":{"name":"高分","点":10000}}
请记住,这些只是近似表示.
总而言之,链接文档的功能与RDBMS PK/FK关系非常相似.这允许一个集合中的多个文档引用另一个集合中的单个文档,这有助于对存储的数据进行重复数据删除.但是,它增加了一层复杂性,要求数据库引擎进行多个磁盘I/O调用,以形成要返回给用户代码的最终文档.嵌入式文档更紧密地匹配内存中的对象,这减少了阻抗不匹配,并且(理论上)减少了磁盘I/O调用的数量.
你可以在这里阅读Impedance Mismatch:http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
UPDATE
我要补充一点,从一开始就选择合适的数据库来满足您的需求是非常重要的.如果您对每个数据库有很多疑问,那么联系每个供应商并获取他们的一些培训材料可能是有意义的.MongoDB提供2个免费课程,您可以在MongoDB大学了解他们的产品和最佳用途.OrientDB确实提供培训,但它不是免费的.最好尝试直接联系他们并获得某种售前培训(如果您希望获得数据库许可),通常他们会让您联系某种售前顾问以帮助您评估他们的产品.