Pergunta

Estou pensando em usar o CouchDB para um próximo site, mas estou um pouco confuso, tanto quanto implementar um sistema de classificações de usuário para o site. Basicamente, cada item de conteúdo pode ser classificado por um determinado usuário. Que maneira de fazer isso faz mais sentido no modelo CouchDB? Eu acho que a maneira mais seca e lógica seria ter três tipos diferentes de documentos, conteúdo, usuários e um documento usuário que se parece com isso.

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

Em seguida, eu criaria uma visualização em que o mapa era o conjunto de todos os documentos de conteúdo e os documentos usuários, digitados pelos documentos de conteúdo, e onde a redução registrou a média das classificações e devolveu o documento de conteúdo com o conteúdo Doc Doc.

Essa é a melhor maneira de fazer isso? Ainda não achei muito em termos de recursos nas melhores práticas do CouchDB, por isso não tenho certeza de tudo isso.

Minha conclusão: a resposta aceita abaixo, que é o que eu praticamente implementaria, mas cuidado, os documentos precisam ser digitados pelo conteúdo do Doc Doc ID, que faz com que as consultas avançadas com base em outras propriedades do documento problemáticas. Vou voltar ao SQL para minhas necessidades neste aplicativo.

Foi útil?

Solução

Parece que você tem uma ideia razoável. O CouchDB é tão novo que acho que levará algum tempo para que as melhores práticas se saquem.

Um par de mapa/redução como esse pode formar um ponto de partida razoável.

mapa:

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

reduzir:

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

NB: Isso map A função requer adicionar o tipo adequado ao seu Rating modelo:

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

Outras dicas

Nós iremos Damien Katz, um dos desenvolvedores do CouchDB, fornece uma descrição de um processo semelhante, então você pode estar fazendo da maneira que as pessoas do CouchDB pretendem.

Eu escrevi sobre uma situação semelhante (embora mais simples que o seu exemplo). Eu estava adicionando classificações de artigos ao meu blog e decidi usar o CouchDB para armazenar as próprias classificações. Eu acho que você tem a ideia certa.

Aqui está um pensamento, no entanto. Você se importa com quem classificou o que, como exibição em algum lugar ou rastreamento? Se sim, continue :)

Caso contrário, por que não apenas atualizar o documento de conteúdo rating atribuir a += 1 (e talvez o documento do usuário rated atribuir a .push( doc._id ) Se você deseja impedir que um usuário classifique o conteúdo mais de uma vez).

Isso simplificaria bastante o manuseio de documentos e daria um melhor desempenho quando a 'leitura' é exibida nas páginas (já que você já terá o documento de conteúdo assumindo) ... isso estaria ao custo de tornar o processo real de classificação mais caro (documentos maiores que vão ao servidor, etc.).

Parece-me que às vezes o CouchDB (e outros bancos de dados de valor-chave) estão no seu melhor quando as coisas não são totalmente normalizadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top