Внедрение пользовательских рейтингов / избранного в CouchDB
Вопрос
Я рассматриваю возможность использования CouchDB для будущего сайта, но я немного запутался в том, как внедрить систему пользовательских рейтингов для сайта.По сути, каждый элемент контента может быть оценен данным пользователем.Какой способ сделать это имеет наибольший смысл в модели CouchDB?Я бы подумал, что самым сухим и логичным способом было бы иметь 3 разных типа документов, Контент, Пользователей и документ user_rating, который выглядит примерно так.
{ user_id: "USERID" content_id: "CONTENTID" rating: 6 }
Затем я бы создал представление, где карта представляла бы собой набор всех документов content docs и user_rating docs с ключом content doc ids, и где reduce подсчитывал среднее значение оценок и возвращал документ content doc с ключом content doc id.
Это лучший способ сделать это?Я еще не нашел много полезных ресурсов в CouchDB best practices, поэтому я довольно неуверен во всем этом.
Мой Вывод:Принятый ответ ниже, который я в значительной степени собирался реализовать, действительно работает, но будьте осторожны, документы должны быть привязаны к идентификатору документа содержимого, что затрудняет расширенные запросы, основанные на других свойствах документа.Я возвращаюсь к SQL для своих нужд в этом приложении.
Решение
Похоже, у тебя появилась разумная идея.CouchDB настолько нова, что я думаю, потребуется некоторое время, чтобы внедрить лучшие практики.
Подобная пара map / reduce могла бы стать разумной отправной точкой.
Карта:
function(doc) {
if(doc.type='rating' && doc.content_id) {
emit(doc.content_id, doc.rating);
}
}
уменьшить:
function(keys, values) {
return sum(values)/values.length
}
ПРИМЕЧАНИЕ:Это map
функция требует добавления соответствующего типа в ваш Rating
Модель:
{
type: 'rating',
user_id: "USERID",
content_id: "CONTENTID",
rating: 6
}
Другие советы
Что ж Damien Katz, один из разработчиков Couchdb, дает описание аналогичный процесс, так что, возможно, вы делаете это так, как задумали сотрудники Couchdb.
Я писал о похожей ситуации (хотя и более простой, чем ваш пример).Я добавлял оценки статей в свой блог и решил использовать CouchDB для хранения самих оценок.Я думаю, у вас правильная идея.
Однако вот одна мысль.Вас волнует, кто что оценил, например, для показа где-нибудь или отслеживания?Если да, продолжайте :)
Если нет, то почему бы просто не обновить содержимое документа rating
атрибут для += 1
(и, возможно, пользовательский документ rated
атрибут для .push( doc._id )
если вы хотите запретить пользователю оценивать контент более одного раза).
Это значительно упростило бы работу с документами и повысило производительность при "считывании" оценок для отображения на страницах (поскольку предполагается, что у вас уже есть документ с содержанием)...Это было бы связано с удорожанием фактического процесса ранжирования (отправка больших документов на сервер и т.д.).
Мне кажется, что иногда CouchDB (и другие базы данных типа "ключ-значение") работают наилучшим образом, когда ситуация не полностью нормализована.