想象一下Facebook的群组功能,使用MongoDB。什么是构建数据的最佳方法?
此数据的主要操作是查找属于该组的用户,并确定用户X是否是该组的成员。
一个选项是在Group
文档中包含一个字符串数组。
{
name: "Pets United",
members: [
"iuahsdfuhasdfasdf",
"qwefqwefqwefqweff",
"ioeroigkergnknmkm"
]
}
另一种方法是在membership
文档中包含User
数组ID。
{
firstName: "Sergio",
age: 27,
groups: [
"iuahsdfuhasdfasdf",
"qwefqwefqwefqweff",
"ioeroigkergnknmkm"
]
}
如果我希望某个群体拥有数千名用户,那么你认为哪一个更好?
答案 0 :(得分:2)
TL; DR 在管理文档和查询这些文档之间进行权衡。
请记住,MongoDB文档有一个size limit of 16MB(使用包含字符串的数组将会永远达到目标,但仍然如此)。我可能会做关系"人属于小组"而不是"小组包含人":
{
firstName: "Sergio",
age: 27,
groups: [
"iuahsdfuhasdfasdf",
"qwefqwefqwefqweff",
"ioeroigkergnknmkm"
]
}
一个拥有数千名成员的团体的可能性比属于数千个团体的团体更有可能,因此如果文件大小限制完全是一个问题(它可能会赢得但不管怎样),我会选择"人与群体的关系"正如你的建议。
还要记住如何查询数据。在您的第一个示例中(" group contains people"),要在组页面中显示用户,您需要执行以下操作:
people.find({ _id: { $in: group.members } })
反过来查询:
people.find({ $where: 'this.groups.indexOf(group) > -1' })
这些只是举例说明这样做的例子(可能有其他人)。