【问题标题】:When should we use embedded documents in MongoDB?我们什么时候应该在 MongoDB 中使用嵌入式文档?
【发布时间】:2018-07-04 13:22:10
【问题描述】:

我阅读了很多关于嵌入 MongoDB 的内容,但我仍然不知道何时使用它。我想到了一些场景:

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

  • _id
  • 姓名

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

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

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

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

  4. 或者我应该将 userGroup 文档添加为用户集合中的嵌入文档。不过,我认为我不应该这样做。

我应该使用哪个选项?

【问题讨论】:

  • 没有客观正确的答案。您必须考虑查询内容的方式,以及嵌入文档在存储在数组中时最终可能超过文档大小(或创建一个非常大、笨重的文档)这一事实。
  • @DavidMakogon,所以我应该始终使用引用的集合?
  • MongoDB 被设计为无模式,目的是在这方面保持灵活性。通常,如果您有一对多的关系并且您不打算以后自己更改子对象,只需将它们作为存储对象的嵌入属性。在这种特殊情况下,我个人会使用单独的用户组集合,但这只是个人偏好和您在不久的将来可能遇到的潜在问题的问题。
  • 一些相关阅读herehere

标签: mongodb


【解决方案1】:

由于 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

当字段很少更新时。

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

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

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 2019-01-02
    • 1970-01-01
    • 2011-07-04
    • 2017-09-13
    • 2021-12-29
    • 2011-07-17
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多