2009-09-09 12 views
2

J'essaie de créer un système de points dans mon programme similaire au débordement de pile, c'est-à-dire lorsque l'utilisateur fait une bonne action (activité) ses points sont augmentés. Je me demande quelle est la meilleure façon de mettre en œuvre ceci en termes de schéma + db.Points système comme stackoverflow

Je pense à trois options:

  1. Ajouter un champ supplémentaire appelé points dans la table des utilisateurs, et chaque fois qu'un utilisateur fait quelque chose, l'ajouter à ce domaine (mais ce ne sera pas en mesure de montrer un activité de sortes)
  2. Créer une fonction qui s'exécutera chaque fois que l'utilisateur fait une bonne action et il calcule à partir de zéro la valeur et met à jour le champ de points
  3. Calculer à chaque fois en utilisant une fonction sans champ de points.

Quelle est la meilleure façon de faire à ce sujet? Merci pour votre temps.

Répondre

2

Personnellement, j'utiliserais la deuxième option pour aborder ce problème.

La première option limite les fonctionnalités, donc je l'élimine immédiatement.

La troisième option est inefficace en termes de performance - il est probable que vous serez récupérez ce numéro beaucoup, et, si votre programme est quelque chose comme stackoverflow, montrant peut-être (calcul) le nombre de fois par pageview /action.

Pour moi, la deuxième option est une solution hybride décente. Normalement, je déteste avoir des données dupliquées dans mon système (actions et points, plutôt que l'un ou l'autre), mais dans ce cas, un champ entier est une quantité plutôt petite d'espace par utilisateur qui vous sauve un temps de recalculer les valeurs inutilement.

Nous devons parfois échanger de l'espace de stockage de données pour des performances ou vice versa, et je dirais que le # 2 est un compromis qui profite grandement à l'application.

0

Je voudrais aller pour 1 et 2 (courir en cron à chaque minute ou plus).

Alors que: - champ supplémentaire agirait comme un cache à la quantité de point. - La fonction permettant de calculer les points pourrait être une simple requête sql qui recalculerait les points pour tous les utilisateurs à la fois pour gagner en vitesse.

Je pense que recalculer le champ à chaque fois que le point est reçu serait une surdétermination.

0

Cela dépend beaucoup du nombre de calculs attendus. En fait, le SO utilise apparemment une méthode qui est similaire à votre approche 1), pour des raisons de performance, je suppose. Ceci empêche également les sauts dans les nombres si les facteurs changent (comme les éléments supprimés qui ont attribué des points, ou ici sur les réponses SO qui deviennent wiki communautaire, les changements dans les règles de points, les actions externes comme joindre un autre compte ici sur SO etc. Si une solution recalc (2) correspond à ce que vous voulez, vous pouvez implémenter une mise en cache "intelligente" en effaçant la valeur (en la définissant sur NULL, ce qui signifie "sale") chaque fois qu'une modification de point peut avoir lieu , et le recalculer quand il est NULL, en utilisant le cache autrement.Vous pouvez également (en tant que mesure autocorrectrice lorsque des choses non explicites se produisent) effacer les valeurs après une heure, un jour ou quoi que vous en pensiez, afin qu'un recalc soit forcé après un certain temps, indépendamment de l'état "sale" .

0

Personnellement, j'irais avec la première option, et ajouter un tableau "Actions" pour garder une trace de votre historique d'activité.

Lorsqu'un utilisateur fait quelque chose de bien, il obtient une entrée dans le tableau "Actions", avec l'action et une valeur de point. La valeur du point peut provenir d'une autre table ou d'un fichier de configuration. Cette même valeur est ajoutée à l'enregistrement de l'utilisateur. À tout moment, vous pouvez résumer les actions et obtenir le total de l'utilisateur, mais pour les performances, la simple mise à jour lorsque vous ajoutez l'enregistrement d'action serait assez simple.

0

À quel point votre système de points sera-t-il simple? Je pense une sorte de l'exploitation forestière/journalisé est bon pour que vous puissiez suivre l'activité sur une base quotidienne/hebdomadaire/mensuel à tous les utilisateurs

Questions connexes