具有list属性的MongoDB对象模型设计

时间:2012-09-13 02:19:52

标签: mongodb database-design model

我刚刚开始使用MongoDB,我很困惑用list属性构建对象模型。 我有一个与Followers和Following对象相关的User模型,它是用户ID列表。 所以我可以想到一些对象模型结构来表示关系。

  1. 嵌入式文档。追随者和追随者嵌入到用户模型中。这样,在每个请求中的许多Web框架中都会生成“current_user”对象,并且由于我们在大多数请求中很少使用这些属性,因此序列化/反序列化Follower和Follow列表属性会带来额外的开销。我们可以在生成“current_user”时排除这些属性。但是,我们需要在对其进行任何更新之前再次获取完整的“current_user”对象。

  2. 在用户模型中使用参考属性。我们可以拥有Followers和Follow对象模型本身,而不是嵌入,但保存对User对象的引用。

  3. 在关注者和关注模型中使用参考属性。我们可以将用户ID保存在Follower和Follow属性中,以便以后查询。

  4. 可能还有其他一些方法,更容易使用或更好的性能。我的问题是:
    设计具有一些相关列表属性的模型的建议方法是什么?

1 个答案:

答案 0 :(得分:1)

对于来自SQL世界(例如我自己)的人来说,了解MongoDB最难的事情之一就是新的架构设计风格。在SQL世界中,一切都进入第三范式。人们开始认为有一种正确的方法来设计他们的模式,因为通常只有一种。

在MongoDB世界中,没有一种最佳的架构设计。更准确地说,在MongoDB中,模式设计取决于应用程序如何访问数据。

以下是为MongoDB设计好的架构时需要回答的关键问题:

  • 你有多少数据?
  • 您最常见的操作是什么?您是主要插入新数据,更新现有数据还是进行查询?
  • 您最常见的疑问是什么?
  • 您最常见的更新是什么?
  • 您希望每秒进行多少次I / O操作?

如果您正在考虑一对多的对象关系,以下是这些问题的解决方法。

在SQL中,您只需创建一对具有主键/外键关系的主/明细表。在MongoDB中,您有许多选择:您可以嵌入数据,可以创建链接关系,可以复制和非规范化数据,也可以使用混合方法。

正确的方法取决于有关应用程序用例的大量细节。

以下是关于MongoDB架构设计的一些很好的一般参考。

MongoDB演示文稿:

以下是一些关于MongoDB架构设计的书籍,我认为你会发现它很有用:

以下是一些示例架构设计: