Domanda

Sto pensando di utilizzare CouchDB per un sito imminente, ma sono un po 'confuso per quanto riguarda come implementare un sistema di valutazioni degli utenti per il sito. Fondamentalmente, ogni elemento di contenuto può essere valutato da un determinato utente. Quale modo di fare ciò ha più senso nel modello CouchDB? Penserei che il modo più ASCIUTTO e più logico sarebbe quello di avere 3 diversi tipi di documento, Contenuto, Utenti e un documento di valutazione utente che assomigli a questo.

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

Quindi, creerei una vista in cui la mappa era l'insieme di tutti i documenti di contenuto e dei documenti di valutazione degli utenti codificati dagli ID dei documenti di contenuto e in cui la riduzione corrispondeva alla media delle classificazioni e restituiva il documento di contenuto digitato dall'ID di documenti di contenuto .

È questo il modo migliore per farlo? Non ho ancora trovato molto in termini di risorse sulle migliori pratiche di CouchDB, quindi non sono abbastanza sicuro di tutto questo.

La mia conclusione: La risposta accettata di seguito, che è ciò che avrei praticamente implementato, funziona, ma attenzione, i documenti devono essere codificati dall'ID del documento di contenuto che rende problematiche le query avanzate basate su altre proprietà del documento. Torno su SQL per le mie esigenze in questa app.

È stato utile?

Soluzione

Sembra che tu abbia un'idea ragionevole. CouchDB è così nuovo che penso che ci vorrà un po 'prima che le migliori pratiche vengano eliminate.

Una coppia mappa / riduzione come questa potrebbe costituire un ragionevole punto di partenza.

mappa:

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

ridurre:

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

NB: quella map funzione richiede l'aggiunta del tipo corretto al tuo Rating modello:

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

Altri suggerimenti

Bene Damien Katz , uno degli sviluppatori di Couchdb, fornisce una descrizione di un processo simile , quindi potresti farlo nel modo inteso dalla gente di Couchdb.

Ho scritto di una situazione simile (anche se più semplice del tuo esempio). Stavo aggiungendo le valutazioni degli articoli sul mio blog e ho deciso di utilizzare CouchDB per archiviare le valutazioni stesse. Penso che tu abbia l'idea giusta.

Ecco un pensiero, però. Ti interessa chi ha valutato cosa, come per la visualizzazione da qualche parte o il monitoraggio? In tal caso, continua :)

In caso contrario, perché non aggiornare semplicemente l'attributo rating del documento di contenuto a += 1 (e forse l'attributo rated del documento dell'utente a .push( doc._id ) se si desidera impedire a un utente di classificare il contenuto più di una volta).

Ciò semplificherebbe notevolmente la gestione dei documenti e darebbe prestazioni migliori quando si "leggono" le classifiche da visualizzare sulle pagine (poiché si avrà già il documento di contenuto in modo ipotetico) ... Questo sarebbe a costo di rendere il processo effettivo di valutazione più costosa (documenti più grandi che vanno al server, ecc.).

Mi sembra che a volte CouchDB (e altri database di valori-chiave) siano al meglio quando le cose non sono completamente normalizzate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top