0

在我的应用程序中有users. 每个用户可能有很多朋友(其他用户)。如果用户 A 有朋友 B,则用户 B 有朋友 A - 总是。例如,我将不得不查询用户集合以获取用户 A 的所有朋友。而且我还必须为此查询使用地理空间索引,以从用户 A 获取给定半径内用户 A 的所有朋友。

尝试在 MongoDB 中“建模”这种结构时遇到一些问题。现在我有这个(在猫鼬中):

{
    created: { type: Date, default: Date.now },
    phone_number: { type: String, unique: true },
    location: { type: [Number], index: '2dsphere' },
    friends: [{ phone_number: String }]
}

所以每个用户都包含其他用户电话号码的数组(电话号码标识每个用户)。但我认为这不是一个好主意,因为一个用户可能有零个或多个朋友 - 所以朋友数组将是可变的并且可能会显着增长。

对该结构建模的最佳选择是什么?

4

1 回答 1

2

两种方法:

加入收藏

类似于关系方法,其中有一个集合,其中包含表示友谊的文档(本质上是两个对象 ID 和关于关系的可能元数据)。

每个用户的数组

创建一个数组并将朋友的对象 id 推送到数组上。

创建友谊时,您需要修改两个朋友(将每个朋友推到另一个朋友的数组中)。友谊解散也是如此。

哪一个?

连接收集方法较慢,因为它需要多个查询来获取友谊数据,而不是让用户自己持久保存(利用数据局部性)。但是,如果关系的数量以无限的方式增长,则数组方法是不可行的。MongoDB 文档有 16mb 的限制,实际上限为 1000 左右,之后使用数组变得缓慢且笨拙。

于 2013-05-22T15:40:48.623 回答