问题描述
我有 users
和 projects
的集合.每个项目都完全连接到一个用户.
I have collections of users
and projects
.Every project is connected exactly to one user.
我的问题是:每个用户都应持有项目ID列表吗?
My question is: should every user hold the list of project ids?
如果我要检索特定用户的所有项目,则该选项更有效和最佳实践:
If i want to retrieve all the projects of a specific user, which option is more efficient and best practice:
- 在用户ID属性的项目集合上创建索引.不仅仅是查询用户ID属性.
- 在项目ID属性的项目集合上创建索引.相比之下,如果用户持有其项目ID,则只需查询那些特定ID的项目集合即可.
选择哪个选项?也许还有第三种更好的选择?第一种选择的优点是,删除/添加项目时,我不需要更新用户文档中的项目列表.
Which option to choose? Maybe there is a third option that is better?The advantage of the first option, is that i don't need to update the list of project in the user document when deleting/adding projects.
谢谢!
推荐答案
一个用户
可以有多个 projects
(并且一个项目仅与一个用户相关联).这是一对多关系.
A user
can have many projects
(and a project is associated with one user only). This is a one-to-many relationship.
每个用户
应该存储他/她的项目
的列表.例如:
Every user
should store the list of his/her projects
. For example:
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
等.
Note that each project
is a sub-document (object or embedded document) within the projects
array. A project
has its related details like, projectId
, projectName
, etc..
a.在用户id属性上的项目集合上创建索引.不仅仅是查询用户ID属性.
a. Create an index on projects collection on the user id property. than just query on user id property.
b.在项目id属性上的项目集合上创建索引.比方说,如果用户持有其项目ID,则只需查询项目这些特定ID的集合.
b. Create an index on project collection on the project id property. than, if the user holds its project ids, just query projects collection for those specific ids.
我认为,应该只有一个集合被称为 user_projects
.假设:(i)一个 user
可能有0到100个项目,并且(ii)一个 project
的详细信息不是太大.
I think, there should be only one collection called as user_projects
. Assuming that: (i) a user
may have 0 to 100 projects, and (ii) a project
's details are not too huge.
这是将1-to-N关系的许多"面嵌入一个"面的模型.这是推荐的方式,可以对数据进行非规范化.这具有高效和快速查询的优势.这样简化了事务,因为只需对同一集合中的文档进行一次操作即可进行写入(插入,更新和删除).
This is a model of embedding the 'many' side of the 1-to-N relationship into the 'one' side. This a recommended way, de-normalizing the data. This has the advantage of efficient and fast queries. This simplifies transactions, as writes (inserts, updates and deletes) are going to be atomic with single operation to a document within the same collection.
您将使用 user
id
或 name
(具有唯一索引)来检索文档,这将非常快询问.您可以在 projects
数组上具有索引(数组字段上的索引称为 Multikey Indexes )-在项目的字段上.例如,在 projectId
或/和 projectName
上进行索引是有意义的.
You will be using the user
id
or name
(with a unique index) to retrieve a document, and it will be very fast query. You can have index on the projects
array (indexes on array fields are called as Multikey Indexes) - on the project's fields. For example, index on projectId
or/and projectName
makes sense.
您可以获取用户的所有项目-使用 user
id
/ name
的简单查询.查询 projection 允许显示与 project
相关的信息.您可以使用 find
或 aggregate
方法来构建查询.您可以使用 projectId
或 projectName
向特定的 project
查询一个 user
.由于在 user
和 project
字段上都有索引,因此这将是一种高效的查询.
You can get all projects for a user - its a simple query using the user
id
/ name
. Query projection allows what information related to project
is displayed. You can use a find
or aggregate
method to build the query.You can query a specific project
for a user
, using the projectId
or projectName
. Since there are indexes on user
and project
fields, this will be an efficient query.
因此,我的建议是有一个单一集合 user_projects
,其中包含 user
的信息和 project
信息
So, my recommendation is to have a single collection, user_projects
, with a user
's information and the projects
information embedded in it.
这篇关于MongoDB-我的用户文档应包含项目ID的列表吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!