我正在考虑将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以满足我的需求。
答案 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(和其他键值数据库)处于最佳状态。