实际上,这个问题的答案取决于您正在设计什么样的屏幕以及您要进行什么样的查询来获取数据。让我们来看看每个选项的优缺点,这将帮助您权衡每个选项。
方式 1 :- 将 user_ids 数组放入组集合中
优点
1) 如果您有一个屏幕显示特定组的组详细信息以及属于该组的所有成员 (users_ids) 的列表,那么一个查询可以获取此屏幕所需的所有详细信息,而且速度也会更快。
缺点
1) 如果在组详细信息屏幕中,您必须显示用户详细信息以及组详细信息,那么由于 mongodb 不提供任何连接,您将在单独的查询中获取用户详细信息,并将在客户端上同时加入边。这可能会影响性能。
2) 如果您有一个显示用户详细信息和他/她所属的所有组的屏幕,那么您将在组集合的用户数组中搜索 user_id。如果您预计组中的成员数量非常多(数百万),那么在数组中搜索可能会导致巨大的性能影响。
方式 2 :- 在组集合内复制用户文档
重复数据在 Mongodb 中不是问题,但你应该有一个很好的理由。当关系是 1:few 而不是 1:many 时,拇指规则应该是重复数据。
优点
1) 这种方法将使您免于在客户端加入组和用户集合,因为一个查询可以获取组及其用户的所有详细信息。
缺点
1) 假设您有一百万个组,而 user_id_1 属于 100,000 个组,那么每当您对 user_id_1 进行更新时,您就必须更新 100,000 个文档。这可能再次导致巨大的性能影响。
2) 另外,如果有大量用户订阅 1 个组,则该组的文档大小会不断增加。在 Mongodb The maximum BSON document size is 16 megabytes 中,这意味着您不能拥有大于 16MB 的文档,因此您不能无限地将用户添加到组中。这会限制您的功能。
方式 3:- 在用户集合中嵌入组详细信息
优点
1) 一个查询可以获取用户详细信息以及该用户所属所有组的所有详细信息。
2) 如果您希望一个组中的用户很少,那么用户文档中的组数组将很少。这不会超过 16MB 的限制。
缺点
1) 如果您期望用户可以订阅很多组(数百万),那么用户文档可能会超过 16MB 的限制。
2) 此外,如果您在组详细信息中的更新非常频繁,那么您将不得不在许多用户文档中更新相同的内容。
您还可以通过以下链接获取有关数据模型设计的更多详细信息:-
https://docs.mongodb.org/manual/core/data-model-design/