Question

J'envisage d'utiliser CouchDB pour un site à venir, mais je suis un peu confus quant à la mise en œuvre d'un système de classification des utilisateurs pour le site. Fondamentalement, chaque élément de contenu peut être évalué par un utilisateur donné. Quelle manière de procéder est la plus logique dans le modèle CouchDB? Je pense que la manière la plus logique et la plus logique serait d’avoir 3 types de document différents, Content, Users, et un document user_rating qui ressemble à ceci.

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

Ensuite, je créerais une vue dans laquelle la carte regrouperait tous les documents de contenu et les documents user_rating indexés par des identifiants de documents de contenu, et où la réduction de la moyenne des notations serait renvoyée et renvoyée par les identifiants de documents de contenu. .

Est-ce la meilleure façon de faire cela? Je n'ai pas encore trouvé beaucoup de ressources sur les meilleures pratiques de CouchDB, alors je ne suis pas sûr de tout cela.

Ma conclusion: La réponse acceptée ci-dessous, qui correspond à ce que j'allais mettre en œuvre, fonctionne, mais attention, les documents doivent être indexés par un ID de document de contenu, ce qui rend les requêtes avancées basées sur d'autres propriétés de document gênantes. Je retourne à SQL pour mes besoins dans cette application.

Était-ce utile?

La solution

On dirait que vous avez une idée raisonnable. CouchDB est si nouveau que je pense qu’il faudra un certain temps avant que les meilleures pratiques s’effacent.

Une paire carte / réduction comme celle-ci pourrait constituer un point de départ raisonnable.

carte:

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

réduire:

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

NB: Cette map fonction nécessite l'ajout du type approprié à votre Rating modèle:

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

Autres conseils

Eh bien, Damien Katz , l'un des développeurs de Couchdb, décrit un processus similaire , afin que vous puissiez le faire comme prévu par les utilisateurs de Couchdb.

J'ai écrit sur une situation similaire (bien que plus simple que votre exemple). J'ajoutais des notes d'article à mon blog et j'ai décidé d'utiliser CouchDB pour stocker les notes elles-mêmes. Je pense que vous avez la bonne idée.

Voici une pensée, cependant. Vous souciez-vous de qui a noté quoi, par exemple pour l'affichage quelque part ou le suivi? Si oui, continuez:)

Sinon, pourquoi ne pas simplement mettre à jour l'attribut rating du document de contenu sur += 1 (et peut-être l'attribut rated du document utilisateur sur .push( doc._id ) si vous souhaitez empêcher un utilisateur d'évaluer le contenu plus d'une fois).

Cela simplifierait grandement la gestion de vos documents et donnerait de meilleures performances lorsque vous "lisez" des classements à afficher sur des pages (puisque vous avez déjà le document de contenu en principe) ... Cela se ferait au détriment du processus réel de classement plus coûteux (documents volumineux allant au serveur, etc.).

Il me semble que parfois CouchDB (et d'autres bases de données de valeurs-clés) sont à leur meilleur lorsque les choses ne sont pas totalement normalisées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top