Práctica recomendada para estructura de base de datos de votación de comentarios

Estoy trabajando en una aplicación PHP que tiene varios objetos que pueden comentarse. 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.

El hecho 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 actual de la base de datos:

Tabla de comentarios:

  • identidad de usuario
  • object_id
  • Total de votos

Tabla de votos:

  • comment_id
  • identidad de usuario
  • votar

Objetivo final:

  • Permita que el usuario vote solo una vez en cada comentario con el menor número de consultas MySQL (cada objeto tiene múltiples comentarios)

Solutions Collecting From Web of "Práctica recomendada para estructura de base de datos de votación de comentarios"

Para asegurarse de que cada votante vote solo una vez, diseñe su tabla de Votos con estos campos: ID de Comentario, ID de Usuario, Valor de Voto. Haga que CommentID y UserID sean la clave principal, lo que garantizará que un usuario obtenga un solo voto. Luego, para consultar los votos por un comentario, haga algo como esto:

SELECT SUM(VoteValue) FROM Votes WHERE CommentID = ? 

¿Eso ayuda?

¿Por qué no guardas 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 y permitir solo un voto por comentario por usuario.

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 progtwig.

en lo que respecta 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és haciendo esto, lo siento, pero no pude interpretar tu mensaje si ese fuera el caso.