Реализация пользовательских рейтингов / избранного на CouchDB - PullRequest
4 голосов
/ 01 февраля 2009

Я рассматриваю возможность использования CouchDB для будущего сайта, но меня немного смущает вопрос о том, как внедрить систему пользовательских рейтингов для сайта. По сути, каждый элемент контента может быть оценен данным пользователем. Какой способ сделать это имеет смысл в модели CouchDB? Я думаю, что самый СУЩЕСТВЕННЫЙ и самый логичный способ - иметь 3 разных типа документов: Контент, Пользователи и документ user_rating, который выглядит примерно так.

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

Затем я бы создал представление, в котором карта представляла собой набор всех документов контента и документов user_rating, основанных на идентификаторах документов контента, и где уменьшение соответствовало среднему значению рейтингов и возвращало документ контента с ключом идентификатора документа контента. .

Это лучший способ сделать это? Я пока не нашел много источников информации о лучших практиках CouchDB, поэтому я почти не уверен в этом.

Мой вывод: Принятый ниже ответ, который я собирался реализовать, работает, но будьте осторожны, документы должны основываться на идентификаторе документа контента, что делает сложные запросы, основанные на других свойствах документа, проблематичными. Я возвращаюсь к SQL для своих нужд в этом приложении.

Ответы [ 3 ]

8 голосов
/ 04 февраля 2009

Похоже, у тебя есть разумная идея. CouchDB настолько нов, что, я думаю, понадобится какое-то время, чтобы отработать лучшие практики.

Подобная пара «карта / уменьшение» может послужить разумной отправной точкой.

карта:

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
}
1 голос
/ 01 февраля 2009

Ну Дэмиен Кац , один из разработчиков Couchdb, дает описание подобного процесса , так что вы можете делать это так, как намерены люди из Couchdb.

0 голосов
/ 10 февраля 2009

Я писал о похожей ситуации (хотя проще, чем ваш пример). Я добавлял оценки статей в свой блог и решил использовать CouchDB для хранения самих оценок. Я думаю, у вас есть правильная идея.

Вот мысль, хотя. Вас волнует, кто что оценил, например, для отображения где-то или отслеживания? Если так, продолжайте:)

Если нет, то почему бы просто не изменить атрибут rating документа содержимого на += 1 (и, возможно, атрибут rated документа пользователя на .push( doc._id ), если вы хотите запретить пользователю оценивать содержимое более одного раза).

Это значительно упростит обработку вашего документа и даст лучшую производительность при «чтении» оценок для отображения на страницах (так как у вас уже есть контент-документ, предположительно) ... Это будет стоить фактического процесса рейтинг дороже (большие документы отправляются на сервер и т. д.).

Мне кажется, что иногда CouchDB (и другие базы данных значений ключей) работают лучше всего, когда все не полностью нормализовано.

...