我正在为过去一年中一直在努力的网站实施用户奖励/成就系统。基本前提类似于您在GameTrailers或GiantBomb.com上可以找到的内容:用户获得奖励徽章(成就的直观表示),用于执行以下操作:制作[x]许多注释,或添加[x]许多项目他们的愿望清单等等。
我正在尝试确定实现这一目标的最有效方法,而且我有点卡住了。我目前的解决方案是:
步骤2和3是我担心的地方,因为每次用户发表评论时我都会执行这些查询。
上面的场景的一个例子如下(这段代码不是完整的,只是一个模拟..顺便说一句,用户ID是我检索的东西,而不是用户输入的东西):
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
下一步
SqlToExecute正在调用一个返回布尔值的函数,如:
select count(id) from comment where userid = @userID
所以说完所有这些,我认为这会奏效,但我很关心性能。我对网络编程不太熟悉,但最好是在会话中保留一个UserStats对象,然后对其进行操作以确定用户是否已经做出足够的评论来完成一项成就?这可能不那么动态,但可能在SQL服务器上压力较小。
任何建议都会非常感谢!!
答案 0 :(得分:0)
这取决于您拥有多少用户操作。如果你的人数很少(比如每天低于10k),你就会有一个很好的方式,请留下它。
如果它更大,您可以将策略更改为每隔一段时间执行一次操作,因此不是每次执行操作时为所有用户调用此函数,而是为所有活动的用户调用该函数。一次持续30分钟。 一定要检查问题是否只在任何给定时间运行一次,如果一次检查的时间超过30分钟,则下一次检查可能无法启动!
或者将信息存储在元表中(使用cols userid,注释数量等)并相对于用户操作操作该表(如增加注释数量)并在每次操作后调用该检查。
有关更具体的答案,请提供一些数据,例如您拥有多少用户,其中有多少是有效用户?每天有多少行动等。最佳表现方式的问题在很大程度上取决于用例的统计数据。