2009-02-07 9 views
33

J'ai réfléchi à la façon de mettre en œuvre la fonctionnalité de badge similaire à SO sur un nouveau site Web. Quelle est la meilleure façon de stocker les critères pour les badges?Meilleure façon de stocker les critères Badge?

Deux idées:

  • Tout le code
  • 'Second système' - créer une architecture méta pour définir badges et leurs critères. Stockez des informations dans la base de données et demandez au code de les interroger pour trouver les badges et leurs critères.

Y a-t-il de meilleurs moyens?

Répondre

37

Règles.

Vous créez des événements dans le système et utilisez des règles dans un processeur de flux d'événements.

Spécifiquement, disons que vous avez un badge "fait 10 messages". Vous ne lancez pas "select count (*) des publications où user =: user" pour chaque article. Au contraire, vous avez une règle simple qui surveille chaque publication et les «compte», en stockant l'état des règles dans le profil de l'utilisateur. De cette façon, "10 postes" est aussi bon marché que "fait 1.000.000" messages.

Cela rend également le système beaucoup plus extensible.

+9

Si vous suivez cette route, faites attention aux cas où vous ajoutez un nouveau badge et devez analyser ce que les utilisateurs existants devraient déjà avoir gagné. –

+0

Oui, absolument un inconvénient du système, mais il est encore plus flexible et évolutif car (en général) l'ajout de nouveaux badges se passe beaucoup moins que de les tester et de les attribuer. –

+0

Alors, comment allez-vous gérer l'ajout de badges sur la route? Disons que j'ai un nouveau badge comme le badge "woot" que SO a ajouté. Comment le rendriez-vous rétroactif? – Micah

18

Je suis d'accord avec Will sur celui-ci. Créer des "événements" sur les pages de sorte que chaque événement se produit à un moment donné, c'est-à-dire

un utilisateur supprime un message, il interroge le module d'événements avec l'événement, disons, EVENT_USER_DELETE_POST, puis vous pouvez sélectionner cet événement et générer une requête en fonction de celui-ci. Vous pouvez ensuite décider si un badge est attribué ou non.

Ceci permettra de garder les deux logiques séparées et de conserver une conception modulaire. Cela devrait être très facile à mettre en œuvre de cette façon. Le seul inconvénient est que si l'événement n'a pas été "capturé" alors un utilisateur peut bien avoir gagné un critère de badge mais il n'a pas encore été récompensé. Cependant, cela ne devrait jamais se produire. La seule situation que je peux penser est si la base de données est manipulée manuellement.

Questions connexes