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

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

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

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

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

有帮助吗?

解决方案

听起来像是你有一个合理的想法去。 CouchDB的是使新的,我认为它会需要一段时间的最佳做法,以抖了出来。

一个地图/减少对这样可能形成一个合理的起点。

图:

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

减少

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

NB:即map功能需要添加适当的类型到您Rating模型:

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

其他提示

出色地 达米恩·卡茨, Couchdb 开发人员之一给出了以下描述: 类似的过程, ,所以您可能会按照 Couchdb 人员的意图进行操作。

我写了类似的情况(虽然比你的例子简单)。我将文章评级到我的博客,并决定使用CouchDB的存储收视率本身。我认为你有正确的想法。

下面有一个想法,虽然。你关心谁额定什么,像什么地方显示或跟踪?如果是这样,进行:)

如果没有,那么为什么不更新内容文件的rating属性+= 1(也许是用户文档的rated属性.push( doc._id )如果要防止评级内容的用户超过一次)。

这将大大简化您的文档处理和提供更好的性能,当“阅读”的评分显示在页面上(因为你已经拥有的内容文档assumingly)...这将是在制作的过程中实际的成本等级更昂贵的(更大的文件要服务器,等等)。

在我看来,有时CouchDB的(和其他键 - 值数据库)在他们的最好的事情时不完全正常化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top