与 SQL 为相同逻辑使用外键相比,MongoDB 在文档中嵌入对象的能力有什么特别的优势吗?
在我看来,唯一的优点是易于使用(也许还有性能?),甚至看起来它也可以很容易地抽象出来(例如,Django 似乎非常直观地处理 SQL 的外键)。
与 SQL 为相同逻辑使用外键相比,MongoDB 在文档中嵌入对象的能力有什么特别的优势吗?
在我看来,唯一的优点是易于使用(也许还有性能?),甚至看起来它也可以很容易地抽象出来(例如,Django 似乎非常直观地处理 SQL 的外键)。
这归结为是否嵌入的经典问题。
在我解释更多内容之前,这里有一些开始的链接:
现在来更具体地回答。
您必须记住 SQL 中外键的服务器端用法:JOIN。嵌入是在单个文档中获取您需要的所有数据的单次往返,但连接不是,它们实际上是基于范围的两个选择,然后合并以省略重复项(在某些数据集上有很大的开销)。
所以外键的使用并不完全依赖于应用程序,它也依赖于服务器和数据库。
话虽如此,有些人误解了 MongoDB 中的嵌入,并试图将所有数据放入一个文档中。不幸的是,您应该始终尝试嵌入所有内容的常识再次强化了这一点。链接和更多内容将提供一些有用的指南。
现在我们清除了一些东西,嵌入 JOIN 的主要优点是:
然而嵌入有一些缺陷:
post
可以嵌入comments
但一个可能由于查询需要而user
不会嵌入。posts
因此,当使用正确时,MongoDB 嵌入可以成为 SQL 连接的巨大力量,但您必须了解何时正确使用它。
Mongo 的核心优势在于它的数据文档视图,这自然可以扩展到数据的“POCO”视图。Mongo 客户端(如 .NET 中的 NoRM 项目)看起来与经验丰富的 Fluent NHibernate 用户惊人地相似,这绝非偶然——您的 POCO 数据模型被简单地序列化为 BSON 并以 1:1 的比例保存在 Mongo 中。不需要映射。
总体而言,这两种技术之间最大的区别在于模型以及开发人员必须如何考虑他们的数据。Mongo 更适合快速应用程序开发。