我正在为过去一年一直在开发的网站实施用户奖励/成就系统。基本前提类似于您在 GameTrailers 或 GiantBomb.com 上找到的内容:用户通过以下操作获得奖励徽章(成就的视觉表示):发表 [x] 条评论,或添加 [x] 条物品到他们的愿望清单等
我正在尝试确定实现此功能的最有效方法,但我有点卡住了。我目前的解决方案是:
- 在数据库中创建每个成就(无论如何都会发生)。成就有一个类别、一个接受编号和动态执行的 SQL,以确定是否满足接受。
- 每当用户执行可能产生成就的操作(例如对文章发表评论)时,我都会运行 SQL 语句来确定他们有资格获得哪些成就(我根据类别进行过滤,并删除他们的成就)已经完成)。
- 从该查询中返回的成就中,我遍历每个并执行动态 SQL 以确定是否满足接受数。如果是这样,则用户完成了成就。
第 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 服务器的压力可能较小。
我们欢迎所有的建议!!