Question

Je travaille sur une application PHP comportant plusieurs objets pouvant faire l'objet de commentaires. Chaque commentaire peut faire l'objet d'un vote, les utilisateurs pouvant lui attribuer la valeur +1 ou -1 (comme Digg ou Reddit). Pour le moment, je prévois une table de 'votes' contenant user_id et leurs informations de vote, ce qui semble bien fonctionner.

Le fait est que chaque objet contient des centaines de commentaires stockés dans un tableau de commentaires séparé. Après avoir chargé les commentaires, je dois totaliser les votes, puis vérifier individuellement chaque vote contre l'utilisateur pour s'assurer qu'il ne peut voter qu'une seule fois. Cela fonctionne, mais cela me semble vraiment très gourmand en bases de données - beaucoup de requêtes ne concernent que les commentaires.

Existe-t-il une méthode plus simple qui consomme moins de bases de données? Ma structure de base de données actuelle est-elle la meilleure solution?

Pour être plus clair sur la structure actuelle de la base de données:

Tableau de commentaires:

  • id_utilisateur
  • id_objet
  • total_votes

Tableau des votes:

  • comment_id
  • id_utilisateur
  • vote

Objectif final:

  • Autorise l'utilisateur à voter une seule fois pour chaque commentaire comportant le moins de requêtes MySQL (chaque objet comporte plusieurs commentaires)
Était-ce utile?

La solution

Pour vous assurer que chaque votant ne vote qu'une seule fois, concevez votre table de votes avec ces champs: CommentID, UserID, VoteValue. Définissez CommentID et UserID comme clé primaire, ce qui garantira qu'un utilisateur ne reçoit qu'un seul vote. Ensuite, pour interroger les votes sur un commentaire, procédez comme suit:

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

Est-ce que cela vous aide?

Autres conseils

Pourquoi ne sauvegardez-vous pas le total des votes pour chaque commentaire? Incrémentez / décrémentez cette mesure lorsqu'un nouveau vote a eu lieu.

Ensuite, vous devez vérifier si l'utilisateur a spécifiquement voté pour ce commentaire et autoriser un seul vote par commentaire par utilisateur.

Vous pouvez définir une condition de jointure SQL qui renvoie tous les votes sur les commentaires faits par l'utilisateur actuel pour cet objet. Si vous n'obtenez aucune ligne, l'utilisateur n'a pas voté. C’est un peu différent de vérifier chaque commentaire un par un dans le programme.

En ce qui concerne la structure de la base de données, le fait de les séparer semble parfaitement logique. vote {user_id, object_id, object_type, vote_info ...)

Vous êtes peut-être déjà en train de le faire, désolé mais je ne pourrais pas interpréter votre message si tel était le cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top