【问题标题】:How to model recurency and hasMany relationship in MongoDB?如何在 MongoDB 中建模递归和 hasMany 关系?
【发布时间】:2013-05-22 23:40:48
【问题描述】:

在我的应用中有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 }]
}

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

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

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    两种方法:

    加入收藏

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

    每个用户的数组

    创建一个数组,并将好友的对象 id 推送到数组中。

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

    哪个?

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

    【讨论】:

    • 嗯,所以如果我假设每个用户最多可以有 1000 个朋友,那么我最好在每个用户上使用数组对吗?
    • 但是数组格式有一个错误,你不能存储关于友谊的额外信息。这可能是个问题。
    • 并非如此,您总是可以将对象(嵌入文档)存储在包含友谊元数据的数组中。
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多