我们什么时候应该在MongoDB中使用嵌入式文档?

时间:2018-06-24 17:33:22

标签: mongodb

我了解了很多有关在MongoDB中嵌入的信息,但是我仍然不知道何时使用它。我想到了一些情况:

我有一个名为UserGroups的集合,其中包含以下字段:

  • _id
  • 名称

现在,我要将用户添加到“用户”集合:

  1. 我应该在Users集合中有一个 groupName 字段,并在UserGroups集合得到更新时对其进行更新。

  2. 我应该在Users集合中添加 groupId 字段,并在需要UserGroups.name时执行连接。

  3. 我应该将用户文档作为嵌入式文档添加到UserGroups集合中。

  4. 或者我应该将userGroup文档作为嵌入式文档添加到Users集合中。但是,我认为我不应该这样做。

我应该使用哪个选项?

1 个答案:

答案 0 :(得分:4)

由于MongoDB模式的灵活性,开发人员不再需要先设计数据库模式,即Entity Relationship Diagram。首先进行应用程序的设计,然后设计数据库架构以匹配应用程序的使用情况(查询,写入,更新等)。另请参见Data Modelling

这就是为什么数据库模式设计没有正确/错误答案的原因。 MongoDB有多种用例,不同的应用程序可以利用不同的模型。

  

我们何时应该在MongoDB中使用嵌入式文档?

在不完全知道您的应用程序将如何与数据交互的情况下,以下答案只是一般准则或方法

赞成嵌入,除非有理由不这样做。

首先尝试将UserGroup规范化为User。例如:

{ userid: 1001,
  name: "Reza Tayebi", 
  group: {id: 10,
          name: "Developer"
  }
}

这种关系是一对一的(不是很多,不是无限的)。

如果用户可以属于一个或几个组,则以上示例适用。如果有多个但限于5个以下,则可以引入一个数组。但是,如果一个用户可以有20个以上的组,或者可以有不限数量的组,则应开始考虑将组分成另一个集合。

很可能会同时发生检索。

如果UserGroups的检索始终与用户相关联。例如,Query some users with their respective groupsQuery some users given a specific group(s)

可能同时发生更新。

如果您可能同时更新UsersUserGroups。 尽管从MongoDB 4.0开始,但是如果UsersUserGroups未嵌入,则可以使用multi-documents transactions,但单个文档事务将更有效。另请参见Atomicity and Transactions

该字段很少更新。

如果组名在集合中很少更新。例如,如果经常需要将整个Developers集合的组名Web Developers更新为Users,则嵌入UserGroups是不合适的。

同样,以上只是设计架构之前应考虑的一般准则,另请参阅以下资源: