gpt4 book ai didi

MongoDB 数组或单独集合

转载 作者:可可西里 更新时间:2023-11-01 10:31:50 26 4
gpt4 key购买 nike

我有一个用户集合。每个用户可能有: - 大量关注者(100K+)并且可能正在关注大量其他用户。 - 大量收藏夹 - 查看的大量项目

我看到 2 个模式设计。关于查询,我需要找到用户关注的人我还需要知道给定用户的收藏夹和观看列表。所有列表(followers, following, favorites 必须有唯一条目

我试图通过 Google 查找类似的问题或主题,但找不到任何内容。

MongoDB 能否处理像这样的大型数组,或者我应该采用设计方法 2,将映射存储在单独的集合中,这样我就可以拥有无​​限数量的映射?

非常感谢您的宝贵意见。

我选择选项 2,因为它允许我拥有无限数量的映射。但在我走那条路之前,我想检查一下是否会有我不想要的问题。

从一种设计转向另一种设计的成本很高。

Design 1 (EMBEDDED ARRAY TO STORE MAPPINGS):
[
{
user: bob, //(key)
followers: ["Alex", "john", "steve", "mark", ... 200K+ entries]
following: ["Mila", "mark", "Bill", "Joe", ... 100K+ entries]
favorites: [ObjectI(1), ObjectId(2),...5K+ entries]
watched: [ObjectI(4), ObjectId(5),...100K+ entries]
},
{
user: Nick, //(key)
followers: [bob", "kery", "Jery", "Tom", ... 200K+ entries]
following: ["Tim", "Shane", "Sally", "Joe", ... 100K+ entries]
favorites: [ObjectI(4), ObjectId(5),...5K+ entries]
watched: [ObjectI(2), ObjectId(9),...100K + entries]
}
]

设计 2(单独的集合存储映射)

user_followers collection:
[
{ user: bob, follower: "Alex" }, //key: (user, follower)
{ user: bob, follower: "john"},
{ user: bob, follower: "steve"},
{ user: bob, follower: "mark"}
... 200K+ entries
]

user_following collection:
[
{ user: bob, following: "Mila"}, //key (user, following)
{ user: bob, following: "mark"},
{ user: bob, following: "Bill"},
{ user: bob, following: "Joe"},
... 100K+ entries
]

user_favorites collection:
[
{ user: bob, favorite: ObjectId(1)},
{ user: bob, favorite: ObjectId(3)},
{ user: bob, favorite: ObjectId(6)},
... 5k entries
},

最佳答案

Can MongoDB handle large array like these or I should go with design approach 2 where store the mapping in separate collections which allow me to have unlimited # of mappings?

在 MongoDB 中,文档可以是 at most 16 MB .对于您的第一个设计,您可能会达到我认为的极限。

但是关于第二种设计,在我看来 user_followersuser_following 集合只是重复相同的数据:如果 bob 正在关注 martha,那么 bob 是玛莎,所以你可以将这两个集合合并为一个,条目如 { followed: 'martha', follower: 'bob' }

更新

评论中有关于如何处理双向关系或查询索引的问题。

给定两个用户 bob 和 martha,他们可以没有任何关系,或者 bob 关注 martha,或者 martha 关注 bob,或者 bob 和 martha 相互关注,即三种不同的可能关系。

现在对于 bob 跟随 martha 的情况,followers 集合将是

[
{
followed: 'martha',
follower: 'bob'
}
]

对于 martha 跟随 bob 的情况,它将是

[
{
followed: 'bob',
follower: 'martha'
}
]

当两者互相跟随时

[
{
followed: 'martha',
follower: 'bob'
}, {
followed: 'bob',
follower: 'martha'
}
]

此设计中唯一开销较大的操作在设计 1 和 2 中也是开销很大的,原因相同:我们需要隔离两个集合之间的公共(public)元素;该操作正在寻找双向关系(例如,鲍勃和玛莎互相跟随)。

就索引而言,只有两个有用,{ follower: 1, followed: 1 }{ followed: 1, follower: 1 } (两者都只对排序有用,因为这两者中的任何一个都涵盖所有过滤情况)。

现在回到设计 2,上面的用例应该是:

鲍勃跟着玛莎

user_followers

[
{
user: 'martha',
follower: 'bob'
}
]

user_following

[
{
user: 'bob',
following: 'martha'
}
]

玛莎跟随鲍勃

user_followers

[
{
user: 'bob',
follower: 'martha'
}
]

user_following

[
{
user: 'martha',
following: 'bob'
}
]

鲍勃和玛莎互相跟随

user_followers

[
{
user: 'bob',
follower: 'martha'
}, {
user: 'martha',
follower: 'bob'
}
]

user_following

[
{
user: 'martha',
following: 'bob'
}, {
user: 'bob',
following: 'martha'
}
]

现在我们可以看到,正如我所指出的,设计 2 将复制所有关注者信息,但绝对没有任何好处。

关于MongoDB 数组或单独集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21980692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com