Внедрение пользовательских рейтингов / избранного в CouchDB

StackOverflow https://stackoverflow.com/questions/501304

  •  20-08-2019
  •  | 
  •  

Вопрос

Я рассматриваю возможность использования 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 (и другие базы данных типа "ключ-значение") работают наилучшим образом, когда ситуация не полностью нормализована.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top