2009-10-14 6 views
1

J'aimerais donner à mes utilisateurs la possibilité d'évaluer chaque élément du site de 1 à 5. Ils doivent également pouvoir revenir en arrière et réviser leur évaluation pour chaque élément comme ils le souhaitent. Enfin, la page de l'élément affiche la moyenne à jour de toutes les évaluations des utilisateurs lorsqu'il est visionné. En ce qui concerne le PHP, je pense que je peux gérer cela. Ce que je lutte avec envisage un ensemble logique de tables pour gérer ce qui précède?mysql - évaluation des utilisateurs, 1 évaluation par utilisateur, mise à jour - structure de la table?

Je pensais que votre niveau:

ID | ITEM## | USERID | RATING 
table design

mais le sentiment que retourner et vérifier en permanence pour voir si un utilisateur avait évalué un élément donné avant et de retourner ce résultat à chaque fois qu'ils voir cet article , ferait pour un ensemble plutôt lent de scripts ... d'autant plus que le nombre d'utilisateurs de l'article & augmente au fil du temps.

Quelqu'un a-t-il une meilleure idée de disposition de table (s) pour ce genre de situation? Nous regardons plus de 1500 articles du lancement et plus régulièrement ajoutés à l'avenir, donc une table par article est un peu excessive n'est-ce pas?

Merci!

Répondre

5

C'est la meilleure façon de le faire. C'est ce qu'on appelle une relation de plusieurs à plusieurs. Vous avez beaucoup d'utilisateurs et de nombreux articles. Un utilisateur peut évaluer de nombreux articles et un article peut être évalué par de nombreux utilisateurs. Au lieu d'avoir un champ ID dans la table que vous avez proposée, placez la clé sur ITEM et USERID. De cette façon, un utilisateur ne peut évaluer un élément qu'une seule fois. Vous obtiendrez une erreur si vous essayez de l'évaluer deux fois. Indiquez également sur ces deux champs pour accélérer la recherche de la table.

2

Je dirais que mettre un index unique sur ITEM et USERID et mettre à jour les lignes avec "REPLACE INTO" devrait fonctionner. Je vous découragerais fortement de faire une table par item juste pour économiser un peu de charge.

Questions connexes