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

时间:2009-02-01 18:20:06

标签: couchdb mapreduce

我正在考虑将CouchDB用于即将推出的网站,但就如何为网站实施用户评级系统而言,我有点困惑。基本上,每个内容项可以由给定用户评级。这样做的方式在CouchDB模型中最有意义?我认为DRYest和最合乎逻辑的方式是拥有3种不同的文档类型,Content,Users和user_rating doc,看起来像这样。

{
  user_id: "USERID"
  content_id: "CONTENTID"
  rating: 6
}

然后,我创建了一个视图,其中地图是由内容doc ID键入的所有内容文档和user_rating文档的集合,其中reduce计算了评级的平均值,并返回了内容doc id键入的内容文档

这是最好的方法吗?我还没有发现CouchDB最佳实践资源的方式,所以我很不确定所有这些。

我的结论: 下面接受的答案,我几乎要实现的确实有效,但要注意,文档需要由内容doc id键入,这使得基于其他文档属性的高级查询很麻烦。我将在这个应用程序中回到SQL以满足我的需求。

3 个答案:

答案 0 :(得分:8)

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

像这样的map / reduce对可能是一个合理的起点。

图:

function(doc) {
   if(doc.type='rating' && doc.content_id) {
     emit(doc.content_id, doc.rating);
   }
}

减少

function(keys, values) {
   return sum(values)/values.length
}

注意:map函数需要在Rating模型中添加正确的类型:

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

答案 1 :(得分:1)

Couchdb开发人员之一Damien Katz给出了similar process的描述,因此您可能会按照Couchdb人员的意图进行操作。

答案 2 :(得分:0)

我写了类似的情况(虽然比你的例子简单)。我正在为我的博客添加文章评级,并决定使用CouchDB来存储评级。我认为你有正确的想法。

但这是一个想法。你关心谁评价什么,比如在某处显示或跟踪?如果是这样,请继续:)

如果没有,那么为什么不将内容文档的rating属性更新为+= 1(如果您想阻止用户,可能还会将用户文档的rated属性更新为.push( doc._id )来自评级内容不止一次)。

这将极大地简化您的文档处理,并在“阅读”评分显示在页面上时提供更好的性能(因为您已经假定已经有内容文档)......这将以制作实际过程为代价评级更高(更大的文件到服务器等)。

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