想象一下使用MongoDB的Facebook群组功能。构造数据的最佳方法是什么?
对这些数据的主要操作将是查找属于该组的用户,并确定用户X是否是该组的成员。
一种选择是在Group
文档中包含字符串数组。
{ name: "Pets United", members: [ "iuahsdfuhasdfasdf", "qwefqwefqwefqweff", "ioeroigkergnknmkm" ] }
另一个可能是membership
在User
文档中具有一组组ID 。
{ firstName: "Sergio", age: 27, groups: [ "iuahsdfuhasdfasdf", "qwefqwefqwefqweff", "ioeroigkergnknmkm" ] }
如果我希望一个小组有成千上万的用户,那么您认为哪个更好?
TL; DR这是在管理文档和查询那些文档之间进行权衡的过程。
请记住,MongoDB文档的大小限制为16MB(使用包含字符串的数组将永远需要它,但是仍然可以)。我可能会做“人属于组”而不是“组包含人”的关系:
{ firstName: "Sergio", age: 27, groups: [ "iuahsdfuhasdfasdf", "qwefqwefqwefqweff", "ioeroigkergnknmkm" ] }
与成千上万的成员相比,包含成千上万的成员的可能性更大,因此,如果根本不考虑文档大小限制(也许不会,但无论如何),我将选择“您建议的人与团体的关系。
还请记住您将如何查询数据。在第一个示例(“组包含人员”)中,要在组页面中显示用户,您需要执行以下操作:
people.find({ _id: { $in: group.members } })
而查询其他方法:
people.find({ $where: 'this.groups.indexOf(group) > -1' })
这些只是示例,说明了执行方法(可能还有其他方法)。