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

Rez*_*994 3 mongodb

我阅读了很多有关在MongoDB中嵌入的内容,但是我仍然不知道何时使用它。我想到了一些方案:

我有一个名为UserGroups的集合,具有以下字段:

  • _ID
  • 名称

现在,我想向“用户”集合添加一个用户:

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

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

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

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

我应该使用哪个选项?

Wan*_*iar 5

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

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

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

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

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

尝试denormalise UserGroupUser第一。例如:

{ userid: 1001,
  name: "Reza Tayebi", 
  group: {id: 10,
          name: "Developer"
  }
}
Run Code Online (Sandbox Code Playgroud)

当关系是一对多时(不是很多,不是无限的)。

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

检索很可能同时发生。

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

何时可能同时发生更新。

如果有可能,你会更新Users,并UserGroups在同一时间。尽管从MongoDB 4.0开始,但如果并且未嵌入,您也可以使用多文档事务,但是单文档事务的性能更高。另请参见原子性和事务UsersUserGroups

字段很少更新时。

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

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