2009-05-01 9 views
6

Estoy trabajando en una aplicación de PHP que tiene varios objetos que se pueden comentar. Cada comentario puede votarse, y los usuarios pueden darle +1 o -1 (como Digg o Reddit). En este momento estoy planeando tener una tabla de 'votos' que contenga user_id y su información de voto, que parece funcionar bien.Práctica recomendada para la estructura de base de datos de votación de comentarios

El problema es que cada objeto tiene cientos de comentarios que se almacenan en una tabla de comentarios separada. Después de cargar los comentarios, tengo que contar los votos y luego verificar cada voto individualmente contra el usuario para asegurarme de que solo puedan votar una vez. Esto funciona, pero solo parece realmente una base de datos intensiva: muchas consultas solo por los comentarios.

¿Existe un método más simple de hacer esto que sea menos intensivo en DB? ¿Mi estructura de base de datos actual es la mejor opción?

Para ser más claro sobre la estructura de base de datos actual:

Comentarios de mesa:

  • user_id
  • object_id
  • total_votes

mesa de Votos:

  • comment_id
  • user_id
  • voto

Fin Objetivo:

  • Permitir al usuario voto una sola vez en cada comentario con menos # de consultas MySQL (cada objeto tiene múltiples comentarios)

Respuesta

8

Para asegurarse de que cada votante vote solo una vez, diseñe su tabla de Votos con estos campos — CommentID, UserID, VoteValue. Haga que CommentID y UserID sean la clave principal, lo que garantizará que un usuario obtenga un solo voto. Entonces, para consultar los votos para un comentario, hacer algo como esto:

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

ayuda eso?

+0

Eso ayuda mucho en realidad, ¡gracias! Esa idea de tener dos llaves principales ni siquiera se me pasó por la cabeza. – mdolon

0

¿Por qué no guarda los votos totales para cada comentario? Incremente/disminuya esto cuando haya ocurrido una nueva votación.

Luego debe verificar si el usuario ha votado específicamente para este comentario para permitir solo un voto por comentario por usuario.

+0

El truco está en la segunda parte, verificando si un usuario ha votado por ese comentario específico, básicamente lleva a tener una mesa de votación por separado. – mdolon

0

Puede poner una condición de unión SQL que devuelve todos los votos en los comentarios realizados por el usuario actual para este objeto, si no obtiene filas, el usuario no ha votado. Eso es ligeramente diferente de que usted verifique cada comentario uno por uno en el programa.

en lo que se refiere a la estructura de la base de datos, mantener estas cosas separadas parece perfectamente lógico. vote {user_id, object_id, object_type, vote_info ...)

Puede que ya esté haciendo esto, lo siento, pero no pude interpretar desde su publicación si ese fuera el caso.

Cuestiones relacionadas