每个项目都与一个用户完全相关。
一个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 有其相关的详细信息,如 projectId、projectName 等。
如果我想检索特定用户的所有项目,
选项更有效和最佳实践:
一个。在用户 id 属性上创建项目集合的索引。
不仅仅是查询用户 ID 属性。
b.在项目 id 属性上创建项目集合的索引。
比,如果用户持有其项目 ID,只需查询项目
这些特定 ID 的集合。
我认为,应该只有一个集合称为user_projects。假设:(i)user 可能有 0 到 100 个项目,并且(ii)project 的详细信息不会太大。
这是一种将 1 对 N 关系的“多”方嵌入“单”方的模型。这是一种推荐的方法,对数据进行反规范化。这具有高效和快速查询的优点。这简化了事务,因为写入(插入、更新和删除)将是原子的,只需对同一集合中的文档进行单一操作。
关于检索特定用户的所有项目:
您将使用user id 或name(带有唯一索引)来检索文档,这将是非常快速的查询。您可以在projects 数组上创建索引(数组字段上的索引称为Multikey Indexes) - 在项目的字段上。例如,projectId 或/和projectName 上的索引是有意义的。
您可以获取用户的所有项目 - 这是一个使用 user id / name 的简单查询。查询projection 允许显示与project 相关的信息。您可以使用find 或aggregate 方法来构建查询。
您可以使用projectId 或projectName 在特定project 中查询user。由于user 和project 字段上有索引,这将是一个高效的查询。
所以,我的建议是有一个集合 user_projects,其中嵌入了 user 的信息和 projects 信息。