使MongoDb架构正确

时间:2015-01-29 16:33:08

标签: mongodb mongoose

寻找为我计划的应用程序存储数据的好方法。

我的每个成员都可以拥有“很多”用户,每个用户都可能有“非常”的项目。

至于查询,我需要:

  • 添加新项目
  • 按成员获取所有用户。
  • 按用户获取所有项目。无需访问特定项目。
  • 按会员获取所有项目。

我正在考虑去标准化和复制数据 - 长写,快速阅读但如果有人对此事有任何建议我很乐意听到它们。

1 个答案:

答案 0 :(得分:0)

根据您对数据和应用程序查询的说法,我建议一个架构,其中member文档包含users数组,其中包含user子文档。 但是,不知道这些user文件可以获得多大或者多少"很多"单个member会有,我无法确定这不会导致member文档过大。

memberuser都有ID。

然后,在单独的item集合中,每个item文档都有member_iduser_id个字段。此{ member_id: 1, user_id: 1 }集合上的索引为item

使用此设置:

添加新项目

db.items.insert({user_id: <user_id>, member_id: <member_id>, weight: 4});

按成员获取所有用户

db.member.find({_id: <member_id>}, {users: 1});

按用户获取所有项目

db.items.find({member_id: <member_id>, user_id: <user_id>})

按成员获取所有项目

db.items.find({member_id: <member_id>})

此设置需要记住的重要一点是,在按用户搜索项目时,您必须指定member_id,否则它将不会使用索引。我建议的索引({ member_id: 1, user_id: 1 })可用于帮助仅使用member_id的查询,但不能用于帮助仅使用user_id的查询。订单对索引很重要。

如果在某个时刻对items集合进行分片是有意义的,请考虑使用member_id作为分片键。