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
- 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.
- 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 !!