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

RezaT1994

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

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

  • _ID
  • 名称

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

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

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

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

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

我应该使用哪个选项?

万巴蒂亚尔

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

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

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

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

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

尝试denormaliseUserGroupUser第一。例如:

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

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

如果用户可以属于一个或几个组,则以上示例适用。如果有多个但限于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是不合适的。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

何时使用嵌入式文档MongoDB

我们何时应该在Kotlin上使用run,let,apply和with的示例

我们应该在何时何地使用这些keras LSTM模型

我们应该在子进程中使用退出还是返回

我们应该在 sql server 的更新查询中使用 alise 名称吗?

我们应该在C语言中使用exit()吗?

我们应该在Android中使用getPath还是getAbsolutePath

为什么我们不应该在Java中使用受保护的静态

我们什么时候应该在 CodeIgniter 中使用核心?

我们应该在观察者模式中使用WeakReference吗?

我们应该在AngularJS中使用jQuery吗?

我们应该在 React Native 中使用类变量吗?

我们应该在OkHttp中使用Google的安全提供程序吗?

为什么我们应该在线程中使用Join?

什么时候我们应该在Rust中使用包装与期望

我们应该在Rails Factory中使用Faker吗?

什么时候我们应该在.exs文件中使用defmodule

我们应该在C ++中使用exit吗?

我们是否应该在调用异步回调的库中使用ConfigureAwait(false)?

我们应该在Qt中使用哪种内存管理方法?

HTML:我们应该在 HTML 文本字段中使用 `type="text"` 吗?

在什么情况下我们应该在类型声明中使用`[] a`?

为什么我们应该在退货声明中使用{}

为什么我们应该在 git commit 命令中使用 -m?

我们什么时候应该在React Native中使用`accessibilityRole`?

我们应该在PHP中使用“ --->”之类的对象范围吗?

我们应该在JWT响应中使用什么Content-type?

我何时应该在代码中使用pandas apply()?

我何时应该在python中使用del?