2010-06-10 110 views
22

作为最流行的NoSQL解决方案之一,MongoDB具有这种方法的大多数优点。但我仍然在努力的一个问题是如何在NoSQL数据存储中反映对象关系,特别是 - MongoDB。在MongoDB中模拟关系

例如,让我们考虑一个简单的数据模型:User,Post和Comment。我很清楚,评论本身没有价值,因此成为帖子的嵌入对象。但是,当涉及到用户 - 这变得棘手,因为用户本身是一个实体,而不是与Post结合。现在,如果我需要列出具有用户全名和网页上的配置文件链接的帖子,我需要列出关于帖子作者的帖子和信息(至少name和id)。

我在这里看到2个可能的解决方案:

  1. 德规范,每个岗位条目包含了作者的ID和全名(以及任何其他用户属性列表的帖子的时候我可能需要)的方式中的数据。这样我会查询数据非常简单,但是当用户更新他/她的配置文件时,我需要用户更新所有帖子。但是,我还需要将用户属性存储在评论对象中,这意味着更新用户配置文件本质上要求我更新用户至少有一条评论的所有帖子,除非我想将评论存储在单独的集合中。
  2. 只在发布对象中存储用户标识并运行2个查询:一个获取帖子列表,另一个获取用户列表,其中用户标识位于帖子作者列表中。这需要在我的应用程序代码中进行2次查询和额外处理才能将用户映射到帖子。

我敢肯定,我不是第一个面对这个问题,但不幸的是,迄今为止,我还没有找到关于此主题的任何最佳实践。意见?

+0

你使用了哪种方法模式? 解决方案1?或解决方案2? – koeder 2011-02-10 22:56:01

+0

在TTT的回答中有很好的描述 - 取决于你的数据需要什么,你需要选择。我在我的应用程序中实现了两种方法。 – 2011-02-11 07:55:55

+0

只是好奇,你喜欢mongodb吗?你的经历如何使用mongo? – koeder 2011-02-12 08:29:10

回答

14

这两个都是有效的解决方案,解决方案1的优点是您可以像这样显示一个页面,只需从db中检索一个文档。用户不会经常更新他们的配置文件,并且可以在更改用户配置文件后更新所有帖子和嵌入的注释异步。您可以将帖子和嵌入的注释编入索引,以便更新速度更快。 mongodb的更新速度非常快,因为mongodb进行了更新,不能回滚或提交,所以mongodb无需记录更改。

但是像站点一样的网站上的用户也有声望,这个声望变化比他们的个人资料更多。

解决方案2需要每页检索更多文档,但是您可以使用$ in运算符和用户标识列表(用户标识的用户标识+用户标识的注释),因此您只需要两个“选择语句”。

1

我遇到类似的问题,这是我如何解决它:

(当我解决了这个问题,我驾驶的动机是为了避免联接)

使用2个独立的集合:一个针对用户,一种为POSTS。将用户对象与帖子一起存储在帖子集合中。用户对象更改时不要更新帖子集合。维护用户信息的是USERS集合。确保发布数据最终会包含陈旧的用户信息,但用户多久更换一次他/她的个人资料。

如果您必须显示绝对最新的用户信息以及每篇文章,然后从缓存中检索用户信息。

希望这对你有用。我的解决方案仍在开发中,因此我没有负载测试结果与您分享。