首页 > 解决方案 > MongoDB - 我的用户文档是否应该包含项目 ID 列表?

问题描述

我有users和的集合projects。每个项目都与一个用户完全相关。

我的问题是:每个用户都应该持有项目 ID 列表吗?

如果我想检索特定用户的所有项目,哪个选项更有效和最佳实践:

  1. 在用户 id 属性上创建项目集合的索引。不仅仅是查询用户 ID 属性。
  2. 在项目 id 属性上创建项目集合的索引。比,如果用户持有其项目 ID,只需查询项目集合以获取这些特定 ID。

选择哪个选项?也许还有第三种更好的选择?第一个选项的优点是我在删除/添加项目时不需要更新用户文档中的项目列表。

谢谢!

标签: mongodbnosqldata-modeling

解决方案


每个项目都与一个用户完全相关。

一个user可以有很多projects(并且一个项目只与一个用户相关联)。这是一对多的关系。


我的问题是:每个用户都应该持有项目 ID 列表吗?

每个人都user应该存储他/她的列表projects。例如:

user:
    id: <some value>,
    name: <some value>,
    email: <some value>,
    projects: [
        { projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
        { projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
         ...
    ]

请注意,每个都是数组project中的子文档(对象或嵌入文档) 。projectsAproject有其相关的详细信息,如 、projectIdprojectName等。


如果我想检索特定用户的所有项目,哪个选项更有效和最佳实践:

一个。在用户 id 属性上创建项目集合的索引。不仅仅是查询用户 ID 属性。

湾。在项目 id 属性上创建项目集合的索引。比,如果用户持有其项目 ID,只需查询项目集合以获取这些特定 ID。

我认为,应该只有一个名为 as 的集合user_projects。假设:(i)auser可能有 0 到 100 个项目,并且(ii)aproject的细节不是太大。

这是将 1 对 N 关系的“多”方嵌入“单”方的模型。这是一种推荐的方法,对数据进行反规范化。这具有高效和快速查询的优点。这简化了事务,因为写入(插入、更新和删除)将是原子的,只需对同一集合中的文档进行单一操作。


关于检索特定用户的所有项目:

您将使用user idor name(带有唯一索引)来检索文档,这将是非常快速的查询。您可以在projects数组上拥有索引(数组字段上的索引称为Multikey Indexes) - 在项目的字段上。例如,索引projectId或/和projectName是有意义的。

您可以获取用户的所有项目 - 它是使用user id/的简单查询name。查询投影允许project显示相关的信息。您可以使用findoraggregate方法来构建查询。您可以使用or查询特定project的 a 。由于和字段上有索引,这将是一个有效的查询。userprojectIdprojectNameuserproject

所以,我的建议是有一个集合,user_projects,其中包含 auser的信息和projects嵌入的信息。


推荐阅读