如何设计我的Mongo数据库

时间:2016-04-09 17:41:57

标签: mongodb database-design database

我有一个收集用户,即姓名,密码,电子邮件等 我还有一个收集组,每个组都有它的成员 - 用户阵列 我应该如何设计我的数据库?我清楚地看到了两种方法:
方式1(类似于MySQL):每个用户都有一个_id,所以我只是将它放入成员数组中,所以就这样吧。
方式2:复制整个用户文档,加上一些字段 在MongoDB网站上,他们告诉重复数据无需担心存储的低价格。他们还说我们应该避免数据读取的JOIN。

3 个答案:

答案 0 :(得分:2)

  

重复数据无需担心

在更新时,需要担心。假设您在每个文档中嵌套并复制了用户详细信息。当用户更改名称时会发生什么?您必须在每个文档中更新该用户的每个实例。

小心区分数据和实体。用户是一个实体,在复制实体之前要仔细考虑,因为以后修复它可能很难。

就个人而言,除非您发现自己处于性能太慢而无法实时加入的情况,否则我会拆分它们。然后,只有这样,考虑合并。

答案 1 :(得分:1)

这取决于您将如何在应用程序中使用数据。

如果您有超过2个组,并且您必须搜索所有组中的用户,则将用户文档嵌入组中(方式2)并不是一个好主意。所以在这种情况下我会使用方式1。

如果您在执行查询时只有2个组或应用程序之前知道用户组,请使用方式2.

我认为分离数据是可行的方法,因为直接更新,获取和删除用户数据会更好。

答案 2 :(得分:1)

实际上,回答这个问题取决于您正在设计的屏幕类型以及您要获取数据的查询类型。让我们来看看每个选项的优缺点,这将有助于您权衡每个选项。

方式1: - 将user_ids数组放入群组集合

<强>赞成

1)如果您有一个显示特定组的组详细信息的屏幕以及属于该组的所有成员(users_ids)的列表,那么一个查询可以获取此屏幕所需的所有详细信息,并且它也会更快。

<强>缺点

1)如果在组详细信息屏幕中,您必须显示用户的详细信息以及组详细信息,那么由于mongodb不提供任何联接,您将在单独的查询中获取用户详细信息并且将在客户端上加入侧。这可能会对性能产生影响。

2)如果您有一个显示用户详细信息的屏幕以及他/她所属的所有组,那么您将在组集合中的用户数组中搜索user_id。如果您希望组中的成员数量非常高(数百万),那么在阵列内搜索会对性能产生巨大影响。

方式2: - 在组合集内复制用户文档

复制数据在Mongodb中不是问题,但你应该有一个很好的理由。当关系为1:很少而不是1:很多时,Thumb规则应该是重复数据。

<强>赞成

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/