Pergunta

Eu estou trabalhando em um aplicativo PHP que tem vários objetos que podem ser comentadas. Cada comentário pode ser votada, com os usuários ser capaz de dar-lhe +1 ou -1 (como Digg ou Reddit). Agora eu estou pensando em ter uma tabela 'votos' que tem carrega user_id e suas informações de votação, que parece funcionar bem.

A coisa é, cada objeto tem centenas de comentários que são armazenados em uma tabela de comentários separado. Depois que eu carregar os comentários, eu estou tendo a contagem dos votos e depois verificar individualmente cada voto contra o usuário para ter certeza que só pode votar uma vez. Isso funciona, mas apenas parece realmente banco de dados intensiva -. Um monte de consultas para apenas os comentários

Existe um método mais simples de fazer isso que é menos DB intensiva? É a minha estrutura de banco de dados atual a melhor maneira de ir?

Para ser mais claro sobre a estrutura de banco de dados atual:

Comentários tabela:

  • user_id
  • object_id
  • total_votes

Votos tabela:

  • comment_id
  • user_id
  • voto

Fim gol:

  • Permitir que o usuário vote apenas uma vez em cada comentário com menos # de consultas MySQL (cada objeto tem vários comentários)
Foi útil?

Solução

Para se certificar de que cada eleitor vota apenas uma vez, projetar sua mesa Votos com estes campos-CommentID, UserID, VoteValue. Faça CommentID e UserID a chave primária, que irá certificar-se de que um usuário recebe apenas um voto. Então, para consultar os votos para um comentário, faça algo como isto:

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

Isso ajuda?

Outras dicas

Por que você não salvar os votos totalizados para cada comentário? Aumentar / diminuir isso quando uma nova votação que aconteceu.

Em seguida, você tem que verificar se o usuário votou especificamente para este comentário para permitir que apenas um voto por comentário por usuário.

Você pode colocar um SQL condição de junção que retorna todos os votos sobre os comentários feitos pelo usuário atual para este objeto, se você receber nenhuma linha, o usuário não votou. Isso é apenas um pouco diferente do que você verificar cada comentário um por um no programa.

na medida em que a estrutura de banco de dados está em causa, manter essas coisas separadas parece perfeitamente lógico. voto {user_id, object_id, object_type, vote_info ...)

Você pode estar já a fazer isso, desculpe, mas eu não poderia interpretar de você postar, se fosse esse o caso.

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