【发布时间】:2015-05-24 00:38:04
【问题描述】:
假设我在users、posts、likes 之间有关系。一个用户可以点赞一个帖子,一个帖子可以被很多用户点赞。
我的目标是能够在 MongoDB 中设计一个数据库结构,以便我可以快速查询用户喜欢的所有帖子,并以下面列出的多种方式对它们进行排序/过滤(不是同时 - 想想下拉菜单,可让您更改搜索结果的排序顺序)
- 帖子被点赞的顺序
- 按各种
post属性过滤和排序 - 例如标题、帖子回复数、帖子创建时间等
假设帖子的数量在 100,000 左右,每个帖子的点赞量在 100-1000 左右
我想到的可能解决方案:
1) likes 嵌入在 posts 中。
这使得 #2 可以轻松处理,因为您只需在likes.user_id 和您需要的任何其他帖子属性上都有一个索引。这也很快,因为您只需要运行一个查询。
但是,这使得无法按用户喜欢某物的时间进行排序 (AFAIK)。
2) likes 是具有post_id、account_id 属性的单独集合。
这使得 #1 可以轻松处理,因为您可以按 _id 排序。但是,除非您将post 属性复制并缓存到like 文档中,否则无法处理#2。这是可能的,但实际上并不理想。此外,查询速度较慢。您需要运行两个查询 - 一个查询 like 集合,然后使用 $in: [post_ids] 查询 post。
还有其他我应该考虑的解决方案/设计吗?我在这些建议的解决方案中遗漏了什么吗?
【问题讨论】:
-
非规范化。对于 NoSQL,通常的做法是在多个地方拥有一条信息。因此,例如,您可以结合这两种解决方案,并在单独的表格中嵌入喜欢。
标签: mongodb database-design mongodb-query database