2010-08-03 11 views
2

Chaque utilisateur peut voter une fois par article (seuls les utilisateurs enregistrés peuvent voter). J'ai donc une table des votes des utilisateurs qui comprend l'ID de l'utilisateur, l'ID de l'élément voté et la valeur du vote (de 1 à 10).PHP/MySQL: Système de notation - Somme chaque vote des utilisateurs ou mise à jour de la table des votes généraux?

Je dois montrer le nombre total de votes et d'évaluations pour chaque article, donc je veux savoir ce qui est mieux: Obtenir de la table user_votes tous les votes pour cet article OU enregistrer le vote chaque fois qu'un utilisateur vote dans un tableau des votes puis obtenez juste ce champ forme cette base de données?

Répondre

0

Si vous venez d'incrémenter une somme, vous ne pourrez pas empêcher les votes répétés du même utilisateur.

Vous pouvez utiliser une combinaison des deux. Gardez une table listant tous les votes et l'adresse user_id/ip pour vérifier qu'ils n'ont pas déjà voté et garder une somme associée à l'item pour éviter d'avoir à interroger la table des votes.

1

Vous devriez enregistrer la valeur d'évaluation calculée dans le tableau d'articles, de sorte que vous aurez la possibilité de trier les articles par note, etc. Ce sera beaucoup plus facile.

+0

Après avoir relu la réponse, je ne suis pas d'accord avec elle. Stocker la valeur signifie mettre à jour pour rester synchronisé avec les données existantes - up ** et/ou ** down vote. Cette réponse préconise également la duplication de données redondantes - qui peuvent être récupérées en utilisant des fonctions agrégées (COUNT ou SUM, dépend des besoins). –

+0

Oui, parfois vous avez besoin de données redondantes pour effectuer des requêtes complexes * rapidement *. Surprise? – Sergei

1

Un facteur à considérer est exactement le nombre de votes que vous allez voir. Si nous parlons de vastes ordres de grandeur (disons plus de dizaines de milliers de votes pour chacune des centaines de milliers d'articles), alors stocker chaque vote pourrait finir par utiliser plus de ressources qu'il n'en vaut la peine. D'un autre côté, s'il y a un nombre de votes raisonnablement faible (disons moins de quelques centaines d'enregistrements pour quelques centaines d'items), alors il pourrait être avantageux de stocker chaque vote pour la flexibilité supplémentaire qu'il peut fournir dans le développement futur. Dans un mois, vous pourriez penser à quelque chose de nouveau à faire avec cette information, et avoir l'arriéré des votes pourrait être très utile pour adapter la façon dont cela devrait fonctionner.

Comme d'autres l'ont mentionné, cela pourrait facilement être combiné avec une méta-table pour trier les choses plus facilement et simplifier les requêtes. Personnellement, je recommanderais un view pour ce type de chose, car cela réduirait votre surcharge en rendant les mises à jour automatiques pour les champs contenant des données dérivées.

Questions connexes