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

具有列表属性的MongoDB对象模型设计,mongodb,database-design,model,Mongodb,Database Design,Model,我刚开始使用MongoDB,我对使用list属性构建对象模型感到困惑。 我有一个与追随者相关的用户模型,下面的对象是用户ID列表。 因此,我可以想出一些对象模型结构来表示这种关系 嵌入式文档。追随者和追随者嵌入到用户模型中。这样,在许多web框架中,每个请求都会生成一个“current_user”对象,序列化/反序列化Follower和Following list属性是额外的开销,因为我们很少在大多数请求中使用这些属性。我们可以在生成“当前用户”时排除这些属性。但是,在对其进行任何更新之前,我们

我刚开始使用MongoDB,我对使用list属性构建对象模型感到困惑。 我有一个与追随者相关的用户模型,下面的对象是用户ID列表。 因此,我可以想出一些对象模型结构来表示这种关系

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

  • 在用户模型中使用引用属性。我们可以拥有追随者和跟随对象模型本身,而不是嵌入,而是保存对用户对象的引用

  • 在追随者和后续模型中使用引用属性。我们可以将用户ID保存在Follower和Following属性中,以便以后查询

  • 可能还有其他一些方法,更易于使用或性能更好。我的问题是:

    设计具有一些相关列表属性的模型的建议方法是什么?

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

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

    以下是为MongoDB设计良好模式所需回答的关键问题:

    • 你有多少数据
    • 您最常见的操作是什么?您主要是插入新数据、更新现有数据还是执行查询
    • 您最常见的问题是什么
    • 你最常见的更新是什么
    • 您希望每秒执行多少I/O操作
    如果您考虑的是一对多对象关系,下面是这些问题的结果

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

    正确的方法取决于应用程序用例的许多细节

    下面是一些关于MongoDB模式设计的很好的通用参考资料

    MongoDB演示:

    以下是关于MongoDB模式设计的几本书,我认为您会发现它们很有用:

    • (MongoDB正在运行)
    • (MongoDB的文档设计)
    以下是一些模式设计示例: