在CouchDB上实现用户评级/收藏夹

在CouchDB上实现用户评级/收藏夹,couchdb,mapreduce,Couchdb,Mapreduce,我正在考虑在即将推出的网站上使用CouchDB,但对于如何实现网站的用户评级系统,我有点困惑。基本上,每个内容项都可以由给定的用户进行评级。在CouchDB模型中,哪种方法最有意义?我认为最干练、最合乎逻辑的方式是有3种不同的文档类型,内容、用户和一个类似这样的用户评级文档 { user_id: "USERID" content_id: "CONTENTID" rating: 6 } { 用户id:“用户id” content\u id:“CONTENTID” 评级:6 } 然后,我

我正在考虑在即将推出的网站上使用CouchDB,但对于如何实现网站的用户评级系统,我有点困惑。基本上,每个内容项都可以由给定的用户进行评级。在CouchDB模型中,哪种方法最有意义?我认为最干练、最合乎逻辑的方式是有3种不同的文档类型,内容、用户和一个类似这样的用户评级文档

{ user_id: "USERID" content_id: "CONTENTID" rating: 6 } { 用户id:“用户id” content\u id:“CONTENTID” 评级:6 } 然后,我将创建一个视图,其中map是由content doc id键入的所有content docs和user_rating docs的集合,reduce计算评级的平均值并返回由content doc id键入的content doc

这是最好的方法吗?我还没有找到很多关于CouchDB最佳实践的资源,所以我很不确定这些东西

我的结论是:
下面我将要实现的公认答案确实有效,但请注意,文档需要由content doc id键入,这使得基于其他文档属性的高级查询非常麻烦。在这个应用程序中,我将回到SQL来满足我的需要。

好吧,Couchdb的一位开发人员给出了a的描述,因此您可能正在按照Couchdb人员希望的方式来做

听起来你的想法很合理。CouchDB是如此之新,以至于我认为需要一段时间才能摆脱最佳实践

这样的map/reduce对可能会形成一个合理的起点

地图:

减少:

function(keys, values) {
   return sum(values)/values.length
}
注意:
map
功能需要将适当的类型添加到您的
评级
型号:

{
  type: 'rating',
  user_id: "USERID",
  content_id: "CONTENTID",
  rating: 6
}

我写了一个类似的情况(虽然比你的例子简单)。我将文章评级添加到我的博客中,并决定使用CouchDB自己存储评级。我认为你的想法是对的

不过,这里有一个想法。你在乎谁给什么评分吗,比如在某处显示或跟踪?如果是,请继续:)

如果不是,那么为什么不将内容文档的
评级
属性更新为
+=1
(如果要防止用户对内容进行多次评级,则可能将用户文档的
评级
属性更新为
。push(doc.\u id)

这将大大简化您的文档处理,并在“读取”页面上显示的分级时提供更好的性能(因为您已经有了相应的内容文档)。。。这样做的代价是使实际的评级过程更加昂贵(更大的文档进入服务器等)


在我看来,有时候CouchDB(和其他键值数据库)在事情没有完全规范化时处于最佳状态。

感谢您的反馈,但我正在寻找此任务的具体示例。我理解他在那里谈到的原则,我用它们来推导我上面提出的实现。我只是不确定我的结论是否正确。有两件事:你不需要评级类型本身,只要做if(doc.user\u id&&doc.content\u id&&doc.rating)emit(doc.content\u id,doc.rating)请记住,要使这项工作正常进行,您需要在访问视图时指定group=true。当您更新文档时,如果两个用户同时对同一文档进行评分,您将遇到冲突。由于revs的原因,可以处理此问题。但你是对的,它不能精确地扩展到高流量的东西。但是真的。。。有多少人同时在评分?如果你在写reddit。太多了!
{
  type: 'rating',
  user_id: "USERID",
  content_id: "CONTENTID",
  rating: 6
}