跟踪一段时间内登录的用户数 - 数据库设计

时间:2010-11-12 12:01:36

标签: php asp.net sql session

在我们的应用程序中,我们在线存储了最多的用户。我们通过跟踪每个用户当前和登录时的页面来执行此操作,删除在X分钟内处于非活动状态的用户,然后在线计算用户数,如果更高,则覆盖在线数量最多的用户。

我们如何更改此功能以跟踪一段时间内在线用户的数量,因此我们可以查看在线用户数的折线图。我想我们需要一个cron来运行每1/2/5/10/20/30/60分钟来在线跟踪数字?那么如何存储这些数据,表格会变得非常大。我认为Statcounter / Analytics等公司可以更好地存储这些数据。

任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

没有办法将它存放在更小的空间内。如果您有很长一段时间,则会有一定数量的数据。它取决于登录次数和间隔长度,是否更好地存储登录或用户计数样本。

只需以您需要的最高采样率存储它,例如在一小时后将其分组很容易:

SELECT YEAR(sample_datetime),
       MONTH(sample_datetime),
       DAY(sample_datetime),
       HOUR(sample_datetime),
       AVG(user_count)
FROM stats
GROUP BY 1,2,3,4

答案 1 :(得分:0)

我们有一个存储登录的表格,因此我们有一个user_id列和login_time列。

但是,您可以对此进行扩展,以涵盖您的会话,并在会话结束时存储login_timelogoff_time。这样,您就可以使用简单的SQL查询计算时间范围之间的会话数,例如:

SELECT COUNT(*) AS count
FROM sessions
WHERE login_time <= '$yourTime'
AND logoff_time >= '$yourTime'

在会话自定义处理程序上查看http://www.php.net/manual/en/session.customhandler.php

答案 2 :(得分:0)

正如您已经提到的,您必须将时间/值对存储在某处,可能存储在数据库表中。您所需要的只是日期/时间和在线用户的价值(包含2列的表格)。

数据点的数量取决于您查询计数器的频率。通常情况下,我不认为比不活动阈值更频繁地进行轮询是有用的 - 如果您认为用户在10分钟后处于非活动状态,我不会比每10分钟更频繁地轮询一次。

虽然大多数数据库的数据量不应该是一个问题,但您可能对 Round Robin Database 或至少其概念感兴趣。我们的想法是在上周有一个非常详细的计数器(每10分钟1个数据点),上个月有一个不太详细的计数器(每4个小时),而去年的计数器(每天)甚至更不详细, 等等。通过这种方式设置,您可以随时获得恒定数量的数据点。