質問
今後のサイトに CouchDB の使用を検討していますが、サイトのユーザー評価システムを実装する方法に関しては少し混乱しています。基本的に、コンテンツの各項目は特定のユーザーによって評価できます。CouchDB モデルでこれを行うのに最も合理的な方法は何ですか?DRYes で最も論理的な方法は、Content、Users、および次のような user_評価ドキュメントの 3 つの異なるドキュメント タイプを用意することだと思います。
{ user_id: "USERID" content_id: "CONTENTID" rating: 6 }
次に、マップがコンテンツ ドキュメント ID をキーとしたすべてのコンテンツ ドキュメントと user_評価ドキュメントのセットであるビューを作成します。ここで、reduce は評価の平均を集計し、コンテンツ ドキュメント 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を使用することを決めました。私はあなたが正しい考えを持っていると考えています。
ここでは、しかし、考えです。あなたはどこかに表示または追跡のための好きなものを、定格誰が気にしますか?その場合は、上のキャリー:)
でない場合は、なぜちょうど(あなたが複数回の評価の内容からユーザーを防ぐためにしたい場合はrating
すると、おそらく、ユーザー文書の+= 1
属性)rated
するコンテンツ、ドキュメントの.push( doc._id )
属性を更新しません。
この大幅ドキュメントの取り扱いを簡素化し、(あなたがすでにassuminglyコンテンツの文書があるでしょうので)ページに表示する「読んで」評価する際に、より良いパフォーマンスを与えるだろう...これは、実際のプロセスを作るのコストでだろう定格より高価な(サーバーに行く大きな文書など)。
物事は完全に正規化されていないとき時々のCouchDB(および他のキーと値のデータベースは)彼らの最高の状態であるように私には思えます。