跟踪奖励/成就系统的用户操作

时间:2010-12-12 02:32:16

标签: sql performance web user-tracking

我正在为过去一年中一直在努力的网站实施用户奖励/成就系统。基本前提类似于您在GameTrailers或GiantBomb.com上可以找到的内容:用户获得奖励徽章(成就的直观表示),用于执行以下操作:制作[x]许多注释,或添加[x]许多项目他们的愿望清单等等。

我正在尝试确定实现这一目标的最有效方法,而且我有点卡住了。我目前的解决方案是:

  1. 在数据库中创建每个成就(无论如何都会发生这种情况)。该成就具有类别,接受编号和动态执行的SQL,以确定是否已满足接受。
  2. 每当用户执行可能产生成就的操作(例如对文章发表评论)时,我会运行一条SQL语句来确定他们有资格获得哪些成就(我根据类别进行过滤,然后删除他们已经完成了。)
  3. 从该查询中返回的成就中,我查看每个成员并执行动态SQL以确定是否已满足接受编号。如果是,则用户完成了成就。
  4. 步骤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服务器上压力较小。

    任何建议都会非常感谢!!

1 个答案:

答案 0 :(得分:0)

这取决于您拥有多少用户操作。如果你的人数很少(比如每天低于10k),你就会有一个很好的方式,请留下它。

如果它更大,您可以将策略更改为每隔一段时间执行一次操作,因此不是每次执行操作时为所有用户调用此函数,而是为所有活动的用户调用该函数。一次持续30分钟。 一定要检查问题是否只在任何给定时间运行一次,如果一次检查的时间超过30分钟,则下一次检查可能无法启动!

或者将信息存储在元表中(使用cols userid,注释数量等)并相对于用户操作操作该表(如增加注释数量)并在每次操作后调用该检查。

有关更具体的答案,请提供一些数据,例如您拥有多少用户,其中有多少是有效用户?每天有多少行动等。最佳表现方式的问题在很大程度上取决于用例的统计数据。