[英]Query and Sort in MongoDB for a many-to-many relationship
假设我在users
, posts
, likes
之间有关系。 一个用户可以喜欢一个帖子,而一个帖子可以被许多用户喜欢。
我的目标是能够在MongoDB中设计一个数据库结构,以便我可以快速查询用户喜欢的所有帖子,并以下面列出的多种方式对它们进行排序/过滤(不能同时使用-考虑一个下拉菜单,您可以更改搜索结果的排序顺序)
post
属性进行过滤和排序-例如标题,帖子回复数,帖子创建时间等 假设帖子的数量在100,000个左右,每个帖子的赞数在100-1000个左右
我想到的可能的解决方案:
1) likes
被嵌入posts
。
这使#2可以轻松处理,因为您只是在likes.user_id
以及所需的其他任何post属性上都有一个索引。 这也很快,因为您只需要运行一个查询。
但是,这使得无法按用户喜欢的时间进行分类(AFAIK)。
2) likes
是具有属性post_id
, account_id
的单独集合。
由于您可以按_id排序,因此可以轻松处理#1。 但是,除非您将post
属性复制并缓存到like
文档中,否则将无法处理#2。 这是可能的,但实际上并不理想。 此外,这查询起来较慢。 您需要运行两个查询-一个查询like
集合,然后使用$ in进行post
查询:[post_ids]。
我还应该考虑其他解决方案/设计吗? 我在这些建议的解决方案中缺少任何内容吗?
我将使用#2的非规范化版本。 有一个like
文件:
{
"_id" : ObjectId(...),
"account_id" : 1234,
"post_id" : 4321,
"ts" : ISODate(...),
// additional info about post needed for basic display
"post_title" : "The 10 Worst-Kept Secrets of Cheesemongers"
// etc.
}
随着指数{ "account_id" : 1, "ts" : 1 }
则可以有效地找到like
由像时间排序特定用户的文档。
db.likes.find({ "account_id" : 1234 }).sort({ "ts" : -1 })
如果将有关帖子的基本信息放入like
文档中,则无需检索帖子文档,直到用户单击链接以显示整个帖子。
折衷是,如果某个帖子的某些like
嵌入的信息发生更改,则需要在每个“ like
进行更改。 这可能什么都不是,也可能很麻烦,这取决于您选择嵌入的内容以及帖子在收到很多喜欢后被修改的频率。
您的第一选择对我来说似乎很不错。 它很好地满足了您的两个需求。 如,
2个集合的缺点是您需要运行2个查询来获取一条数据。 NoSQL数据库使您可以灵活地将相关数据存储在一个位置,并提供最佳的性能。 不使用NoSQL的好处,您将无法获得优化的性能。
不要从RDBMS角度考虑(忘记标准化)。 如果您需要使用第一个选项进行更多性能优化,则可以使用索引,分片(使用分片键作为字母范围,地理位置等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.