使用MongoDB进行数据库设计

eff*_*iss 3 database-design mongodb

我第一次使用MongoDB,而且我不完全确定在我所处的情况下最佳实践是什么.这就是我想要做的:

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

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

Ale*_*scu 8

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

这就是官方MongoDB架构设计文档的开始.

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

  1. 哪个实体是父母,哪一个是孩子?他们真的有联系吗?
  2. 父实体最常见的访问模型是什么?它总是需要取出所有孩子吗?
  3. 子实体最常见的访问模型是什么?您是单独访问它还是大部分时间与其父级一起获取它?
  4. 你经常把孩子追加到父母身边?
  5. 这些追加操作是在高度并发的环境中发生的吗?
  6. 您多久需要更新一次嵌入式文档?

阅读MongoDB文档我已经指出并回答上述问题会给你最终答案.


Tyl*_*ock 7

我会在"事件"文档中嵌入聊天记录.

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

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

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

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

希望有所帮助,欢呼!