2010-07-20 4 views
9

Je suis mise en œuvre d'un système de réputation comme Stackoverflow sur mon paroles de rap site explication, Rap Genius:La meilleure façon de mettre en œuvre la réputation de style Stackoverflow

  • bonne explication: 10
  • explication Bad: -1
  • ont le plus d'explications sur une chanson: +30

Ma question est de savoir comment mettre en œuvre. Spécifiquement, j'essaye de décider si je devrais créer une table de reputation_events pour aider au re-calcul de réputation, ou si je devrais juste recalculer à partir de zéro chaque fois que j'ai besoin.

Le tableau de reputation_events aurait des colonnes pour:

  • nom (par exemple, "good_explanation", "bad_explanation")
  • awarded_to_id
  • awarded_by_id
  • awarded_at

Chaque fois que quelque chose se passe qui affecte la réputation, j'insère une ligne correspondante dans reputation_events. Cela facilite le recalcul de la réputation et la génération d'une séquence d'événements lisible par l'homme qui a généré la réputation d'une personne donnée. En revanche, une action donnée peut affecter la réputation de plusieurs utilisateurs. Par contre, une action donnée peut affecter la réputation de plusieurs utilisateurs. Par exemple, supposons que l'utilisateur A dépasse l'utilisateur B sur une chanson donnée; basé sur l'objectif "Avoir le plus d'explications sur une chanson", je devrais me rappeler de supprimer l'événement original "has_the_most_explanations" de B (ou peut-être ajouterais-je un nouvel événement pour B?)

+1

J'ai trouvé cette vidéo géniale: http://www.youtube.com/watch?v=Yn7e0J9m6rE –

+0

duplication possible de [Comment puis-je créer un système de "réputation" semblable à StackOverflow en utilisant Rails?] (Http: // stackoverflow.com/questions/5719050/how-can--create-a-reputation-system-similar-to-stackoverflow-using-rails) – Hauleth

Répondre

5

En général, je n'aime pas que les données existent à plus d'un endroit. Il semble que votre table "reputation_events" contienne des données qui peuvent être calculées à partir d'autres données. Si c'est le cas, je recalculerais à partir de zéro, à moins que l'impact sur les performances ne devienne un réel problème.

Lorsque vous avez stocké des données calculées, il se peut que celles-ci ne correspondent pas correctement aux données de base, ce qui est fondamentalement un état corrompu. Pourquoi même rendre possible si vous pouvez l'éviter?

1

Je ferais un événement de réputation liste aux fins de recalculer et être en mesure de déterminer pourquoi la valeur totale rep est ce qu'elle est.

Mais pourquoi avoir une colonne "nom", pourquoi ne pas avoir une valeur avec un int positif ou négatif?

Cette table sera énorme, assurez-vous que vous mettez en cache.

Questions connexes