Mongodb 对于以下情况,正确的noSQL集合结构是什么?

Mongodb 对于以下情况,正确的noSQL集合结构是什么?,mongodb,database-design,couchdb,database-schema,nosql,Mongodb,Database Design,Couchdb,Database Schema,Nosql,作为一个习惯于用关系术语进行思考的人,我正在尝试用“noSQL方式”来掌握思考 假设以下场景: 我们有一个博客(如9gag.com),里面有很多帖子和注册用户。每个用户都可以喜欢每一篇文章。我们希望构建一个推荐引擎,因此我们需要跟踪: 用户查看的所有帖子 用户喜欢的所有帖子 帖子有:标题、正文、类别。用户有:用户名、密码、电子邮件和其他数据 在关系数据库中,我们会有如下内容:posts,users,posts\u users\u视图(post\u id,users\u id,view\u d

作为一个习惯于用关系术语进行思考的人,我正在尝试用“noSQL方式”来掌握思考

假设以下场景:

我们有一个博客(如9gag.com),里面有很多帖子和注册用户。每个用户都可以喜欢每一篇文章。我们希望构建一个推荐引擎,因此我们需要跟踪:

  • 用户查看的所有帖子
  • 用户喜欢的所有帖子
帖子有:标题、正文、类别。用户有:用户名、密码、电子邮件和其他数据

在关系数据库中,我们会有如下内容:
posts
users
posts\u users\u视图(post\u id,users\u id,view\u date)
posts\u users\u like(post\u id,user\u id,like\u date)

问题

面向文档/列的noSQL数据库中的“正确”结构是什么


澄清:我们是否应该在用户中保存所有查看/喜欢的帖子ID(或帖子中的用户ID)的数组?如果是这样的话,我们会不会有一个行大小变得巨大的问题?

在CouchDB中,您可以为用户、发布、查看等创建单独的文档。按用户显示视图/喜好可以通过“视图”(物化地图/减少查询)进行排列,地图功能发出一个数组键
[user\u id,post\u id]
。因此,您将获得已排序的词典(按关键字按字典顺序排列),因此,按照
user='ID'
获取所有视图是一个查询,其关键字从
[ID]
[ID,{}]
。您可以对其进行优化,但基本解决方案非常简单

在CouchDB中有一条关于使用和机制(可以替代一些简单连接)的注释。为了获得一些直觉,我建议研究帖子和评论的问题,这也很简单,但不像查看和喜欢那样琐碎:)


可能没有NoSQL方式,但我认为大多数map/reduce系统都有类似的思维方式。CouchDB是一个很好的开始工具,因为它非常有限:)在分布式环境中很难进行任何低效的查询,而且它的map和reduce查询函数不会有副作用(当文档集更改时,它们将以增量方式生成物化视图,并且结果不应取决于文档更新的顺序).

@CRUSADER请提供一个好的链接,它将有助于回答这个问题。@CRUSADER这正是这个问题产生的原因。每个MongoDB教程都说,您必须在用户中保存一个查看或喜欢的帖子ID数组(反之亦然)。因此,我担心:会有很多帖子受到用户的喜爱,也会有很多用户浏览并喜欢这些帖子。@CRUSADER,这是没有帮助的。我个人对视频网站这样做的方式是,你拥有由我的应用程序管理的预聚合统计集合。因此,我有一个详细的集合,将用于每个帖子的收集凝灰岩,那么我会做:对于更复杂的stuff@Philipp有一种NoSQL方式:“忘记关系方式”;)