Implementieren von Benutzerbewertungen / Favoriten auf CouchDB
Frage
Ich erwäge für eine bevorstehende Website CouchDB, aber ich bin ein wenig verwirrt, so weit so weit, wie ein System von Benutzerbewertungen für die Website zu implementieren. Grundsätzlich kann jedes Inhaltselement von einem bestimmten Benutzer bewertet werden. Welche Art und Weise, dies zu tun am meisten Sinn macht in dem CouchDB-Modell? Ich würde denken, die trockenste und logischste Weg 3 verschiedene Dokumenttypen, Inhalt, Benutzer und ein user_rating doc zu haben wäre, die etwa wie folgt aussieht.
{ user_id: "USERID" content_id: "CONTENTID" rating: 6 }
Dann würde ich eine Ansicht erstellen, in dem die Karte die Menge aller Inhalte docs war und user_rating von Inhalt doc ids verkeilt docs, und wo die der Mittelwert der Bewertungen ausgezählt reduzieren und kehrte den Inhalt doc von Inhalt doc-ID eingegeben .
Ist das der beste Weg, dies zu tun? Ich habe noch nicht gefunden viel in der Art von Ressourcen auf CouchDB Best Practices, damit ich bin mir ziemlich unsicher, all dieses Zeug.
Mein Fazit: Die akzeptierte Antwort unten, das ist das, was ich ziemlich viel los war funktioniert zu implementieren, aber Vorsicht, müssen die Dokumente von Inhalt doc-ID eingegeben werden, die auf anderen Dokumenteigenschaften mühsam basierend erweitern Abfragen machen. Ich werde für meine Bedürfnisse in dieser App auf SQL zurück.
Lösung
Klingt wie Sie eine vernünftige Idee gehen haben. CouchDB ist so neu, dass ich denke, es wird eine Weile dauern, für die besten Praktiken zu schütteln.
Eine Karte / reduziert Paar wie könnte dies einen vernünftigen Ausgangspunkt bilden.
Karte:
function(doc) {
if(doc.type='rating' && doc.content_id) {
emit(doc.content_id, doc.rating);
}
}
reduzieren:
function(keys, values) {
return sum(values)/values.length
}
NB: Die map
Funktion der richtige Art zu Ihrem Rating
Modell erfordert das Hinzufügen:
{
type: 'rating',
user_id: "USERID",
content_id: "CONTENTID",
rating: 6
}
Andere Tipps
Nun Damien Katz , einer der CouchDB-Entwickler, eine Beschreibung eines
Ich schrieb über eine ähnliche Situation (obwohl einfacher als Ihr Beispiel). Ich war das Hinzufügen Artikel Bewertungen zu meinem Blog und entschieden CouchDB verwenden die Ratings selbst zu speichern. Ich denke, dass Sie die richtige Idee haben. Hier ist ein Gedanke, though. Haben Sie Sorge, wer was gelesen wie irgendwo oder Tracking für die Anzeige? Wenn ja, machen sie weiter:) Wenn nicht, dann warum nicht nur der Inhalt des Dokuments aktualisieren Dies würde sehr Ihr Dokumenten-Handling vereinfachen und eine bessere Leistung geben, wenn ‚Lesen‘ Bewertungen auf Seiten angezeigt werden (da Sie bereits den Inhalt Dokument assumingly haben werden) ... Dies würde macht den eigentlichen Prozess auf Kosten sein Bewertung teurer (größere Dokumente auf den Server gehen, etc). Es scheint mir, dass manchmal CouchDB (und andere Schlüssel-Wert-Datenbanken) am besten sind, wenn die Dinge nicht völlig normalisiert. rating
Attribut += 1
(und vielleicht das rated
Attribut des Benutzers Dokument .push( doc._id )
, wenn Sie einen Benutzer von Rating-Gehalt mehr als einmal verhindern wollen).