10
votes

Récupère efficace pour un système de vote dans PHP et MySQL

J'ai un système où les utilisateurs enregistrés peuvent voter / voter les commentaires pour une image. Il est très similaire au système de vote de la pile de pile.

Je stocke les votes dans une table avec des valeurs comme telles: xxx

J'ai quelques questions concernant la rapidité et l'efficacité Pour ce qui suit:

Problème: Une fois qu'un utilisateur ouvre la page d'image avec des commentaires, j'ai besoin si cet utilisateur a déjà voté de haut / bas sur un commentaire pour le montrer comme; "Vous avez voté" ou "Vous avez voté" à côté du commentaire (dans le débordement de la pile, l'image du vote est mise en surbrillance).

Ma solution possible: en ce moment quand j'ouvre un page de page i LOOP à travers chaque commentaire, et je me réchauffe également à travers ma table des votes et vérifiez si un utilisateur a voté et montrez le statut (je comparais le vote_user_id avec la session de l'utilisateur).

cette? Quelqu'un a-t-il une meilleure approche pour résoudre ce genre de problème?


2 commentaires

Comment stockez-vous s'il s'agit d'un vote initial ou d'une voix basse?


Bien désolé raté de la mettre ici. J'ai un champ 'vote_type' dans ma table


6 Réponses :


2
votes

Vous ne mentionnez pas quelle base de données que vous utilisez mais j'assume une variante SQL.

Ainsi, au lieu de boucler dans toute la table des votes, vous pouvez faire quelque chose comme xxx < / pré>

ou même mieux, lorsque vous récupérez les commentaires réels, vous pouvez faire un joindre xxx

alors vérifiez Si vote_type est nul, up ou bas dans votre boucle d'affichage. Cela pourrait être moins efficace si vous avez 1000 commentaires et que vous ne montrez que 10 à la fois, auquel cas la première méthode devrait aider.

[édité après commentaire ci-dessus sur la colonne Vote_Type]


1 commentaires

J'utilise mysql et désolé d'avoir oublié que j'ai un vote_type. Je vais essayer de tenter votre solution en ce moment.



2
votes

Vous êtes en boucle à travers la table des votes? Laissez-vous la lecture de la base de données en pleine mémoire, puis bouclez-le?

Avez-vous essayé de interroger la base de données uniquement pour les données pertinentes? P>

SELECT vote_comment_id, vote_type
FROM vote
WHERE vote_user_id = 34513
  AND vote_comment_id IN (3443145, 3443256, 3443983)


1 commentaires

3.4+ millions de commentaires. Site actif que vous avez là! :)



0
votes

N'auriez-vous pas besoin d'une colonne pour tout ce que l'utilisateur a voté, c'est-à-dire post_id?

Vous pouvez faire une requête SELECT, voir si une ligne du poste actuel et de l'utilisateur existe - si une ligne est renvoyée, ils ont voté.


En fait, je viens de remarquer que le vote_comment_id n'est pas ce que je l'ai lu comme (vote_commendment).

Vous avez juste besoin de vérifier si une ligne existe


0 commentaires

-1
votes

Ma solution consiste à chercher tous les votes de l'utilisateur lorsqu'il se connecte à une session. Fetch tous les identifiants de commentaires en deux tableaux: xxx

et lorsque l'utilisateur accède à une page de page de page si son identifiant existe dans l'une de ces tableaux.


1 commentaires

C'est un incroyable gaspillage de ressources. Vous obtenez fondamentalement chercher et stocker une montagne de données qui sera, sous vraisemblance, jamais utilisée. - Les données sont déjà stockées à l'intérieur de MySQL, et il est beaucoup plus efficace d'avoir une récupération de MySQL à chaque vote lorsqu'il est nécessaire que de les récupérer tous sur la connexion et de les stocker à la session (essentiellement les dupliquer) où ils seront chargés dans PHP sur chaque demande.



1
votes

Essayez d'éviter d'utiliser le sous-sélection spécialement si vous récupérez un grand nombre de lignes. xxx

à l'aide de la déclaration de cas pour afficher / masquer vote_type. xxx


0 commentaires

0
votes

J'ai un site avec une logique similaire. Je ne suive pas les votes individuels (pour cela), je n'ai qu'une table des poteaux (images), avec un compte de vote et un champ de texte avec UserID: vote; userid: vote ... paires, où vote est +/-. De cette façon, je n'ai pas besoin de choisir parmi la table d'énormes votes et j'ai besoin de charger la ligne appartenant à l'article de toute façon. Une recherche de chaîne simple de "UserID:" révélera si l'utilisateur actuel a voté ou non.

Les transactions acides sont tenues de conserver le nombre de vote et le champ de texte des votes cohérents.


0 commentaires