質問

今後のサイトに 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 開発者の 1 人が、 同様のプロセス, 、つまり、Couchdb の人々の意図どおりに実行している可能性があります。

私は似たような状況(あなたの例よりも簡単ではあるが)について書きました。私は私のブログに記事の評価を追加し、評価そのものを保存するためのCouchDBを使用することを決めました。私はあなたが正しい考えを持っていると考えています。

ここでは、しかし、考えです。あなたはどこかに表示または追跡のための好きなものを、定格誰が気にしますか?その場合は、上のキャリー:)

でない場合は、なぜちょうど(あなたが複数回の評価の内容からユーザーを防ぐためにしたい場合はratingすると、おそらく、ユーザー文書の+= 1属性)ratedするコンテンツ、ドキュメントの.push( doc._id )属性を更新しません。

この大幅ドキュメントの取り扱いを簡素化し、(あなたがすでにassuminglyコンテンツの文書があるでしょうので)ページに表示する「読んで」評価する際に、より良いパフォーマンスを与えるだろう...これは、実際のプロセスを作るのコストでだろう定格より高価な(サーバーに行く大きな文書など)。

物事は完全に正規化されていないとき時々のCouchDB(および他のキーと値のデータベースは)彼らの最高の状態であるように私には思えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top