使用MongoDB进行数据库设计

时间:2012-01-05 04:25:39

标签: database-design mongodb

我第一次使用MongoDB,我不完全确定在我所处的情况下最佳做法是什么。这就是我想要做的事情:

我正在创建一个iPhone应用程序,人们可以创建一个事件,然后聊聊它(为了解决一些细节,让我们说)。我有一个活动的集合。我不知道如何存储用户的聊天记录。我希望聊天与其相应的事件相关联,但我不确定如何做到这一点,因为MongoDB不是关系型的。

我是否应该为聊天和链接(我的意思是MongoDB链接)创建另一个集合/文档到事件?

4 个答案:

答案 0 :(得分:8)

  

设计MongoDB架构时的一个关键问题是何时嵌入和何时链接。嵌入是BSON文档中对象和数组的嵌套。链接是文档之间的引用。

这就是the official MongoDB schema design documentation开始的方式。

在设计文档数据库时,需要记住以下几点:

  1. 哪个实体是父母,哪一个是孩子?他们真的有联系吗?
  2. 父实体最常见的访问模型是什么?它总是需要取出所有孩子吗?
  3. 子实体最常见的访问模型是什么?您是单独访问它还是大部分时间与其父级一起访问它?
  4. 您多久经常将一名儿童加入父母?
  5. 这些追加操作是在高度并发的环境中发生的吗?
  6. 您需要多久更新一次嵌入文档?
  7. 阅读我指出的MongoDB文档并回答上述问题会给你最终答案。

答案 1 :(得分:7)

我会将聊天内容嵌入到活动文档中。

似乎聊天将始终在事件的上下文中引用,因此将其嵌入到内部以便可以轻松访问它是有意义的。

对性能的影响更为微妙。有些事情需要考虑:

如果您使用嵌入式方法,则在检索文档时,聊天内容已经包含在其中。因此,不需要后续查询来检索聊天。这使得访问聊天速度更快,但也可能使得检索事件文档的速度变慢(因为它们更大)。但是,您可以排除不需要的字段(这使得性能与具有两个不同集合的方案的性能相当)

如果您需要在与事件不同的上下文中处理聊天,可能有一天需要使用单独的集合。然而,现在嵌入它们的决定似乎很合理,你总是可以编写一个简单的脚本来将它们移动到自己的集合中。

希望有所帮助,欢呼!

答案 2 :(得分:1)

我将从最简单的方法开始,并设计一个事件集合,其中每个聊天帖子都是嵌入式文档。最近,如果需要性能,你可以将聊天移动到不同的集合。

答案 3 :(得分:1)

在设计数据库模式时,请始终牢记文档的大小限制。对于可数无限增长的子文档,最好将其存储在不同的集合中。这适用于父帖子中的评论,聊天等。希望这会有所帮助。