使用MongoDB进行数据库设计

3
我第一次使用MongoDB,对于我所处的情况并不完全确定最佳实践。这是我要做的事情:
我正在制作一个iPhone应用程序,人们可以创建活动,然后聊天(为了解决一些细节问题)。我有一个用于活动的集合。然而,我不确定应该如何存储用户的聊天记录。我希望一个聊天与其对应的活动相关联,但考虑到MongoDB不是关系型数据库,我不确定如何实现。是否应该为聊天创建另一个集合/文档,并将其链接到事件(这里的链接是指MongoDB的链接)?
4个回答

8
我建议将聊天记录嵌入到活动文档中。
看起来聊天记录总是与事件相关,因此将其嵌入其中是有意义的,这样可以方便地访问它们。
性能的影响更加微妙。需要考虑以下几点:
如果您选择嵌入方式,当检索文档时,聊天记录已包含在其中。因此,不需要使用后续查询来检索聊天记录。这使得访问聊天记录更快,但也有可能使检索事件文档变慢(因为它们更大)。但是,您可以排除不需要的字段(这使得性能相当于具有两个不同集合的情况)。
如果您需要在与事件不同的上下文中处理聊天记录,则将来可能需要使用单独的集合。但是,现在将它们嵌入似乎是明智的决定,并且您始终可以编写简单的脚本将它们移到自己的集合中。
希望这有所帮助,祝好运!

8
设计MongoDB模式时的一个关键问题是何时嵌入和何时链接。嵌入是将对象和数组嵌套在BSON文档中。链接是文档之间的引用。这是官方MongoDB模式设计文档的开头。
设计文档数据库时需要记住以下几点:
  1. 哪个实体是父级,哪个是子级?它们真的有联系吗?
  2. 对于父实体,最常见的访问模式是什么?是否总是需要获取所有子实体?
  3. 子实体的最常见访问模式是什么?您是否单独访问它,还是大多数情况下与其父实体一起获取它?
  4. 您多久会向父实体添加一个子实体?
  5. 这些附加操作是否发生在高度并发的环境中?
  6. 您多久需要更新嵌入式文档?
阅读我指出的MongoDB文档并回答上述问题将为您提供最终答案。

1

在设计数据库模式时,始终要记住文档的大小限制。对于可数无限增长的子文档,最好将其存储在不同的集合中。这适用于父帖子中的评论、聊天等内容。希望这能够帮到您。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接