【问题标题】:MongoDB - should my user document hold a list of project ids?MongoDB - 我的用户文档是否应该包含项目 ID 列表?
【发布时间】:2020-08-20 18:27:42
【问题描述】:

我收藏了usersprojects。 每个项目都与一个用户完全相关。

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

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

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

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

谢谢!

【问题讨论】:

    标签: mongodb nosql data-modeling


    【解决方案1】:

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

    一个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 都是projects 数组中的一个子文档(对象或嵌入文档)。 project 有其相关的详细信息,如 projectIdprojectName 等。


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

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

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

    我认为,应该只有一个集合称为user_projects。假设:(i)user 可能有 0 到 100 个项目,并且(ii)project 的详细信息不会太大。

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


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

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

    您可以获取用户的所有项目 - 这是一个使用 user id / name 的简单查询。查询projection 允许显示与project 相关的信息。您可以使用findaggregate 方法来构建查询。 您可以使用projectIdprojectName 在特定project 中查询user。由于userproject 字段上有索引,这将是一个高效的查询。

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

    【讨论】:

    • 感谢您的详细回答。所以你的建议总是收藏一个?如果我每个项目都有Offers? (一对多)。根本没有参考?查询更复杂,如果我想按属性搜索项目怎么办?查询效率会降低。
    • (1) “查询比较复杂,如果我想通过项目的属性搜索项目怎么办?这样查询效率会降低” :查询将更容易,并且通过索引查询将变得高效(且快速)。构建数据模型的主要方面之一是提前知道重要的查询是什么——你没有提到任何。但是,你期待很多,不用说。您认为查询很复杂 - 如何?要了解查询,您需要了解如何在 MongoDB 数据模型和相关方法中使用数组。
    • (2) "...如果我对每个项目都有报价?(一对多)":你的问题没有不要反映有关它的任何细节。我的回答是基于您提供的信息。我不知道你的模型的大小。一个项目可以有报价、团队、跟踪、计费等等(我也没有考虑这些)。
    • (3) “所以你的建议总是收藏一个?” 从给定的信息(在问题帖子中)来看,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2020-07-09
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多