正确设置 MongoDb 架构
Getting MongoDb schema right
正在为我计划的应用程序寻找存储数据的好方法。
我的每个成员都可以有 "many" 个用户,每个用户可能有 "squillions" 个项目。
至于查询,我需要:
- 添加新项目
- 按成员获取所有用户。
- 按用户获取所有项目。无需访问特定项目。
- 按成员获取所有项目。
我正在考虑去规范化和复制数据 - 长写,快速阅读,但如果有人对此事有任何建议,我很乐意听取他们的意见。
根据您所说的有关数据和应用程序查询的内容,我会建议一个模式,其中 member
文档包含一个 users
数组,其中包含 user
个子文档。 但是,不知道这些 user
文件有多大,或者 "many" 单个 member
会有多大,我不能确定这是否会导致 member
文件太大了。
member
和 user
都有 ID。
然后,在单独的 item
集合中,每个 item
文档都有 member_id
和 user_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
作为分片键。
正在为我计划的应用程序寻找存储数据的好方法。
我的每个成员都可以有 "many" 个用户,每个用户可能有 "squillions" 个项目。
至于查询,我需要:
- 添加新项目
- 按成员获取所有用户。
- 按用户获取所有项目。无需访问特定项目。
- 按成员获取所有项目。
我正在考虑去规范化和复制数据 - 长写,快速阅读,但如果有人对此事有任何建议,我很乐意听取他们的意见。
根据您所说的有关数据和应用程序查询的内容,我会建议一个模式,其中 member
文档包含一个 users
数组,其中包含 user
个子文档。 但是,不知道这些 user
文件有多大,或者 "many" 单个 member
会有多大,我不能确定这是否会导致 member
文件太大了。
member
和 user
都有 ID。
然后,在单独的 item
集合中,每个 item
文档都有 member_id
和 user_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
作为分片键。