正确设置 MongoDb 架构

Getting MongoDb schema right

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

我的每个成员都可以有 "many" 个用户,每个用户可能有 "squillions" 个项目。

至于查询,我需要:

我正在考虑去规范化和复制数据 - 长写,快速阅读,但如果有人对此事有任何建议,我很乐意听取他们的意见。

根据您所说的有关数据和应用程序查询的内容,我会建议一个模式,其中 member 文档包含一个 users 数组,其中包含 user 个子文档。 但是,不知道这些 user 文件有多大,或者 "many" 单个 member 会有多大,我不能确定这是否会导致 member 文件太大了。

memberuser 都有 ID。

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

使用此设置:

添加新项目

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 作为分片键。