sportspress - Sistema de calificación en PHP y MySQL
wordpress sports league plugin (3)
Si miramos el sitio web stackoverflow tenemos votos. Pero la pregunta es cuál es la mejor manera de almacenar quién ha votado y quién no. Permite también simplificar esto aún más y decir que solo podemos votar hacia arriba, y solo podemos eliminar el voto ascendente.
Estaba pensando que la mesa estaba en tal forma
question - Id(INT) | userId(INT) | title(TEXT) | vote(INT) | ratedBy(TEXT)
El resto es autoexplicativo pero ratedBy es un valor de Id. Separado por comas de los usuarios.
Estaba pensando en leer el ratedBy y compararlo con el userId del usuario registrado actualmente. Si él dosent existe en la clasificaciónPor lo cual puede votar hacia arriba, de lo contrario, puede eliminar su voto. Que a su vez eliminará el valor de la calificaciónBy
Creo que hacer otra mesa de "votación" es mejor. La relación entre usuarios y votos es n an, por lo tanto, se debe crear una nueva tabla. Debería ser algo como esto:
question id (int) | user id (int) | permanent (bool) | timestamp (datetime)
El campo permanente se puede usar para hacer que los votos se queden después de un tiempo dado, como lo hace SO.
Se pueden agregar otros campos de acuerdo a las características deseadas. Como cada fila tendrá al menos 16B, puede tener hasta 250M filas en la tabla antes de que la tabla use 4GB (límite de fat32 si hay un archivo por tabla, que es el caso de MyISAM e InnoDB).
Además, como señala Matthew Scharley en un comentario, no cargue todos los votos a la vez en la memoria (como buscar toda la tabla en un conjunto de resultados). Siempre puede usar la cláusula LIMIT para limitar los resultados de su consulta.
Creo que su diseño no podrá escalar para un gran número de votantes. Lo típico que se debe hacer es crear tablas
Tabla 1: pregunta - Id (INT) | ID de usuario (INT) | texto del título)
Tabla 2: pregunta - ID (INT) | voto (INT) | ratedBy (TEXT)
Entonces puedes contar los votos con una consulta como esta:
SELECT t1.question_Id, t1.userId, t1.title, t2.sum(vote)
FROM table1 t1
LEFT JOIN table2 t2 ON t1.question_id = t2.question_id
Una nueva tabla:
ID del artículo | ID de usuario | Clasificación
Donde ID de artículo e ID de usuario constituyen la clave compuesta, y la calificación sería 1, indicando voto al alza, -1 para un voto a favor y 0 para un voto eliminado (o simplemente eliminar la fila).