如何跟踪用户每天访问该网站X天?

时间:2009-05-31 18:39:56

标签: database-design methodology

Stack Overflow上有一个新徽章。 “woot”徽章授予每天访问该网站30天的用户。你怎么能实现这样的功能?如何以最简单的方式跟踪用户每天访问网站X天的情况?

我想过有两个字段 - 一个用于上次登录的时间戳,另一个用于计算用户持续访问该网站的日期。逻辑是首先将计数器设置为1,并存储登录时间。在下次登录时,检查自上次登录后是否超过一天,并递增计数器,或将其设置回1.然后将时间戳字段更新为当前日期。

你能简单一点吗?

5 个答案:

答案 0 :(得分:4)

你需要有一个cookie,因为人们可能不会每天登录 - 例如因为他们自动登录了2周,或者因为他们在你的网站上做非事情-stop没有睡觉和午餐50小时:)你可能真的想在用户访问网站时计算。

现在,理论上可以记录每次访问并执行数据库查询,如上所述,但您可能会认为(就像我一样)它在有用性和隐私+简单性之间达到了错误的平衡。

您指定的算法有一个显而易见的缺点:由于您只存储整天,因此您会错过每12小时登录和退出的用户(您的算法会将天数保持为1)

这是我发现每个用户两个日期字段最简洁的解决方案,在一种不言自明的非面向对象的Python中:

# user.beginStreak----user.lastStreak is the last interval when 
# user accessed the site continuously without breaks for more than 25h 

def onRegister (user):
    ...
    user.beginStreak = user.endStreak = time() # current time in seconds 
    ...

def onAccess (user): 
    ...
    if user.endStreak + 25*60*60 < time():
        user.beginStreak = time()
    user.endStreak = time()
    user.wootBadge = ( user.endStreak-user.beginStreak > 30*24*60*60 )
    ...

(请原谅我的Pythonic技能,我是学术和第一次网站用户)

您无法使用一个变量执行此任务。我相信有人可以写出一个证明这一事实的干净的论据。

答案 1 :(得分:2)

实际上,如果成员的访问位于SQL数据库中,您可以使用单个SQL查询完成所有操作。这也可能比将所有数据存储到客户端程序以检查它更快:

/*
    Find all members who visited at least once every day
  for 30 or more days.  --RBarryYoung, 2009-05-31
*/
;WITH
  cteVisitDays as (
    Select
      MemberID
    , DATEDIFF(dd,'2008-06-01',VisitTime) as VisitDay
     From tblMembersLog
     Where Not Exists( Select * From tblMemberTags T
    Where T.MemberID = tblMembersLog.MemberID
     And T.TagName = 'WOOT!' )
     Group By MemberID
        , DATEDIFF(dd,'2008-06-01',VisitTime)
    )
, cteVisitRunGroups as (
    Select 
      MemberID
    , VisitDay - Row_Number() Over(
            Partition By MemberID
            Order By VisitDay
        ) as RunGrouping
     From cteVisitDays
     )
SELECT Distinct
  MemberID
 From cteVistRunGroups
 Group By MemberId, RunGrouping
 Having COUNT(*) >= 30

答案 2 :(得分:1)

使用时间戳跟踪数据库中的每次访问(无论如何,您可能已经这样做了)。然后创建一个sql语句并按天分组结果,同时计算当天的访问次数。在过去30天内,不允许有0个访问日...

答案 3 :(得分:1)

我是第二个ropstah的方法。登录时间等用户统计信息通常可在数据库中使用。我们需要从可用数据中得出某些事实。因此,我不想为每次访问和增加内容设置计数器,而是希望在用户登录数据上运行批处理作业并发布当天的结果。

但是,一旦用户“woot”ed,您可能想要停止为该用户计算“woot”。 否则,用户有可能每天都“吵醒”,直到遇到无登录日。 (但这是一个小问题。)

答案 4 :(得分:0)

如果这是您想要记录的唯一内容,那么这可能是一个很好的解决方案。但是,我喜欢将逻辑和日志分开,既可以增加我可以使用的原始信息量,又可以在不破坏现有数据的情况下调整逻辑。

在这种情况下,我会记录每次访问或每个操作(取决于要求/空间/等),然后在某处检查数据并返回true(匹配徽章的标准)或false(与标准不符。)

我会创建一个特定模式来保存这样的信息的唯一情况是,由于数据量或其复杂性,所需的计算耗时太长。