Pregunta

Estoy considerando usar CouchDB para un sitio próximo, pero estoy un poco confundido en cuanto a cómo implementar un sistema de clasificaciones de usuarios para el sitio. Básicamente, cada elemento de contenido puede ser calificado por un usuario determinado. ¿Qué forma de hacer esto tiene más sentido en el modelo CouchDB? Creo que la forma más SECA y más lógica sería tener 3 tipos de documentos diferentes, Contenido, Usuarios y un documento de user_rating que se parece a esto.

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

Luego, crearía una vista en la que el mapa fuera el conjunto de todos los documentos de contenido y los documentos de calificación de usuario escritos por ID de contenido, y donde la reducción calculó la media de las calificaciones y devolvió el documento de contenido clave por ID de documento de contenido .

¿Es esa la mejor manera de hacer esto? Todavía no he encontrado muchos recursos en las mejores prácticas de CouchDB, así que no estoy seguro de todo esto.

Mi conclusión: La respuesta aceptada a continuación, que es lo que prácticamente iba a implementar, funciona, pero tenga cuidado, los documentos deben estar codificados por la identificación del documento de contenido, lo que hace que las consultas avanzadas basadas en otras propiedades del documento sean problemáticas. Voy a volver a SQL para mis necesidades en esta aplicación.

¿Fue útil?

Solución

Parece que tienes una idea razonable. CouchDB es tan nuevo que creo que las mejores prácticas tardarán un tiempo en eliminarse.

Un par de mapa / reducción como este podría formar un punto de partida razonable.

mapa:

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

reducir:

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

NB: esa función map requiere agregar el tipo adecuado a su modelo Rating:

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

Otros consejos

Bueno, Damien Katz , uno de los desarrolladores de Couchdb, da una descripción de un proceso similar , por lo que podría estar haciéndolo de la manera que la gente de Couchdb pretende.

Escribí sobre una situación similar (aunque más simple que su ejemplo). Estaba agregando calificaciones de artículos a mi blog y decidí usar CouchDB para almacenar las calificaciones ellos mismos. Creo que tienes la idea correcta.

Aquí hay un pensamiento, sin embargo. ¿Te importa quién calificó qué, como para mostrar en algún lugar o para rastrear? Si es así, continúe :)

Si no es así, ¿por qué no simplemente actualizar el atributo rating del documento de contenido a += 1 (y tal vez el atributo rated del documento de usuario a .push( doc._id ) si desea evitar que un usuario califique el contenido más de una vez).

Esto simplificaría enormemente el manejo de sus documentos y le daría un mejor rendimiento al 'leer' las calificaciones para mostrar en las páginas (ya que supuestamente ya tendrá el documento de contenido) ... Esto sería a costa de hacer el proceso real de calificación más costosa (documentos más grandes que van al servidor, etc.).

Me parece que a veces CouchDB (y otras bases de datos de valores clave) están en su mejor momento cuando las cosas no están totalmente normalizadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top