2010-12-12 1 views
1

Je suis en train de mettre en place un système de récompenses/réalisations pour un site web sur lequel j'ai travaillé pendant l'année écoulée. La prémisse de base est similaire à ce que vous trouverez sur GameTrailers, ou GiantBomb.com: L'utilisateur obtient des badges de récompenses (une représentation visuelle de la réussite) pour faire des choses comme: Faire [x] beaucoup de commentaires, ou ajouter [x] J'essaie de déterminer le moyen le plus efficace pour mettre en œuvre cela, et je suis un peu coincé. Ma solution actuelle est:Suivi des actions de l'utilisateur pour le système de récompense/réalisation

  1. Créez chaque réalisation dans la base de données (ceci se produira malgré tout). La réalisation a une catégorie, un numéro d'acceptation et SQL à exécuter dynamiquement afin de déterminer si l'acceptation a été satisfaite.
  2. Chaque fois qu'un utilisateur effectue une action susceptible de générer un résultat (par exemple, faire un commentaire sur un article), j'exécute une instruction SQL pour déterminer les réalisations auxquelles il est éligible (filtre basé sur la catégorie et supprimer ceux qu'ils ont déjà terminés). À partir des réalisations retournées dans cette requête, je passe chacune d'entre elles et j'exécute le SQL dynamique pour déterminer si le numéro d'acceptation a été atteint. Si c'est le cas, l'utilisateur a terminé la réalisation.

Les étapes 2 et 3 sont où mes préoccupations se trouvent que je serais effectuer ces requêtes chaque fois que l'utilisateur a fait un commentaire.

Un exemple du scénario ci-dessus est inférieur (ce code n'est pas ensemble parfait, une maquette .. BTW, est quelque chose que je userid récupérer, pas quelque chose que l'utilisateur entre):

achievements = From ach In searchCtx.Achievements 
       Where ach.CategoryID = achievementCategoryID And ach.IsActive = 1 
       Select ach 

For Each achmt As Achievement In achievements 
    Dim achieved As Boolean 
    Dim sqlToExecute As String = qst.SQLToRun 
    sqlToExecute = sqlToExecute.Replace("@USERID", "'" + userid.ToString + "'") 
    sqlToExecute = sqlToExecute.Replace("@TARGETVAL", achmt.AcceptanceNumber) 
    achieved = searchCtx.ExecuteQuery(Of Boolean)(sqlToExecute).First 

    If achieved Then 
     ' Add Conquest to User Achievemnets 
     Dim usrAhmt As New UserAchievement 
     usrAhmt .UserID = userid 
     usrAhmt .DateCompleted = DateTime.Now 
     usrAhmt .AchievementID = achmt .ID 
     searchCtx.UserAchievements.InsertOnSubmit(usrAhmt) 
    End If 

Suivant

Le SqlToExecute appelle une fonction qui retourne un booléen, quelque chose comme:

select count(id) from comment where userid = @userID 

donc, après avoir dit tout cela, je pense que cela va fonctionner, mais je suis préoccupé par Performa nce. Je ne connais pas très bien la programmation Web, mais serait-il préférable de conserver un objet UserStats dans la session, puis de l'utiliser pour déterminer si l'utilisateur a fait suffisamment de commentaires pour terminer une réalisation? Ce serait moins dynamique, mais peut-être moins stressant sur le serveur SQL.

Toutes les suggestions seraient très appréciées !!

Répondre

0

Cela dépend du nombre d'actions de vos utilisateurs. Si vous en avez peu (disons moins de 10k par jour), vous avez une belle façon de le faire. Si elle est plus grande, vous pouvez changer la stratégie pour ne faire l'action qu'une fois de temps en temps, donc au lieu d'appeler cette fonction pour tous les utilisateurs à chaque fois qu'ils font une action, appelez-la pour tous les utilisateurs actifs dans les 30 dernières minutes à la fois. Assurez-vous de vérifier que la question ne s'exécute qu'une seule fois à la fois, si une vérification dure plus de 30 minutes, la suivante peut ne pas démarrer!

Ou stocker les informations dans une méta-table (avec l'ID utilisateur cols, nombre de commentaires, etc) et manipuler cette table par rapport à l'action utilisateur (comme augmenter le nombre de commentaires) et appeler la vérification après chaque action.

Pour une réponse plus spécifique, veuillez fournir des données telles que le nombre d'utilisateurs dont vous disposez, parmi lesquels: combien sont actifs? Combien d'actions y a-t-il par jour, etc.La question de la manière la plus performante dépend fortement des statistiques du cas d'utilisation.

Questions connexes