Question

J'essaie de créer dans mon programme un système de points semblable à un débordement de pile, c.-à-d. 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 cela en termes de schéma de base de données + logique.

Je peux penser à trois options:

  1. Ajoutez un champ supplémentaire appelé points dans la table des utilisateurs, et chaque fois qu'un utilisateur fait quelque chose, ajoutez-le à ce champ (mais cela ne pourra pas afficher une activité de tri)
  2. Créez une fonction qui s'exécutera à chaque fois que l'utilisateur accomplira sa bonne action, calculera la valeur et mettra à jour le champ de points
  3. Calculez à chaque fois à l'aide d'une fonction sans champ de points.

Quelle est la meilleure façon de s'y prendre? Merci pour votre temps.

Était-ce utile?

La solution

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

La première option limite les fonctionnalités, donc je l'élimine tout de suite.

La troisième option est inefficace en termes de performances: il est probable que vous récupériez ce nombre beaucoup et, si votre programme ressemble à quelque chose de pile, vous pouvez peut-être afficher (calculer) ce nombre. plusieurs fois par pageview / action.

Pour moi, la deuxième option est une solution hybride décente. Normalement, je déteste la duplication de donné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é d'espace relativement petite par utilisateur qui vous enregistre un lot de temps pour recalculer les valeurs inutilement.

Nous devons parfois échanger l'espace de stockage de données contre des performances, ou inversement, et je dirais que le n ° 2 est un compromis qui profite grandement à l'application.

Autres conseils

Cela dépend beaucoup du nombre de calculs attendus. En fait, SO utilise apparemment une méthode similaire à votre approche 1), pour des raisons de performances, je suppose.

Cela évite également les sauts dans les chiffres si les facteurs changent (tels que les éléments supprimés qui attribuent des points, ou ici sur les réponses des SO qui deviennent un wiki de communauté, les modifications des règles de points, les actions externes telles que la jonction d'un autre compte ici sur SO, etc. )

Si vous souhaitez une solution recalc (2), vous pouvez implémenter un "intelligent". mettre en cache en effaçant la valeur (définissez-la sur NULL, ce qui signifierait "sale") chaque fois qu'une modification de point peut avoir lieu, et recalculez-la lorsqu'elle est NULL, en utilisant le cache autrement. Vous pouvez également (comme mesure d'auto-correction lorsque des événements non explicites se produisent) effacer les valeurs après une heure, une journée ou ce que vous pensez, afin qu'un recalcul soit forcé après un certain temps, indépendamment du paramètre "sale". état.

Je voudrais aller pour 1 et 2 (courir dans cron toutes les minutes ou plus).

Alors que: - Un champ supplémentaire ferait office de cache pour la quantité de point. - La fonction permettant de calculer les points pourrait être une requête SQL unique qui recalculerait les points pour tous les utilisateurs à la fois pour gagner du temps.

Je pense que recalculer le champ à chaque fois que le point est reçu constituerait une perte de temps.

Personnellement, je choisirais la première option et ajouterais un "Actions". tableau pour suivre l'historique de vos activités.

Lorsqu'un utilisateur fait quelque chose de bien, il reçoit une entrée dans les "Actions". table, avec l'action et une valeur en points. La valeur en points peut provenir d'une autre table ou d'un fichier de configuration. Cette même valeur est ajoutée à la fiche de l'utilisateur.

À tout moment, vous pouvez résumer les actions et obtenir le total de l'utilisateur, mais pour des performances optimales, une simple mise à jour lorsque vous ajoutez un enregistrement d'action est assez simple.

Votre système de points va-t-il être simple? Je pense qu’une sorte de journalisation / journalisation est bonne pour que vous puissiez suivre les activités sur une base quotidienne / hebdomadaire / mensuelle pour tous les utilisateurs

Découvrez http://code.google.com/p/userinfuser/

Son code source ouvert vous permet d’ajouter des points et des badges à votre application. Il possède des liaisons Java, Python, PHP et Ruby.

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