4

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

{
  用户 ID:“用户 ID”
  content_id: "内容 ID"
  评分:6
}

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

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

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

4

3 回答 3

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
}
于 2009-02-04T11:19:00.990 回答
1

那么,Couchdb 开发人员之一Damien Katz给出了类似过程的描述,因此您可能正在按照 Couchdb 人员的意图进行操作。

于 2009-02-01T19:26:42.550 回答
0

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

不过,这是一个想法。您是否关心谁对什么进行了评分,例如在某处显示或跟踪?如果是这样,请继续:)

如果不是,那么为什么不将内容文档的rating属性更新为(如果您想阻止用户对内容进行多次评级+= 1,可能还更新用户文档的rated属性)。.push( doc._id )

这将大大简化您的文档处理并在“阅读”评级以显示在页面上时提供更好的性能(因为假设您已经拥有内容文档)......这将以使评级的实际过程更加昂贵为代价(更大的文件发送到服务器等)。

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

于 2009-02-10T19:46:50.017 回答