Pregunta

Estoy trabajando en una aplicación PHP que tiene varios objetos que se pueden comentar. Se puede votar cada comentario, y los usuarios pueden darle +1 o -1 (como Digg o Reddit). Ahora mismo estoy planeando tener una tabla de 'votos' que contenga user_id y su información de voto, que parece funcionar bien.

La cuestión 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 individualmente cada voto en contra del usuario para asegurarme de que solo puedan votar una vez. Esto funciona, pero parece realmente intensivo en la base de datos: muchas consultas solo para los comentarios.

¿Existe un método más simple para hacer esto que requiera menos DB? ¿Es la estructura de mi base de datos actual la mejor manera de hacerlo?

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

Tabla de comentarios:

  • user_id
  • object_id
  • total_votes

Tabla de votos:

  • comment_id
  • user_id
  • votar

Objetivo final:

  • Permitir al usuario votar solo una vez en cada comentario con al menos # de consultas MySQL (cada objeto tiene múltiples comentarios)
¿Fue útil?

Solución

Para asegurarse de que cada votante vote solo una vez, diseñe su tabla de votos con estos campos & # 8212; CommentID, UserID, VoteValue. Haga que CommentID y UserID sean la clave principal, lo que asegurará que un usuario obtenga solo un voto. Luego, para consultar los votos de un comentario, haga algo como esto:

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

¿Eso ayuda?

Otros consejos

¿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 por este comentario para permitir solo un voto por comentario por usuario.

Puede poner una condición de unión sql que devuelva 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 revises cada comentario uno por uno en el programa.

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 publicación si ese fuera el caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top