如何最好地存储和汇总每日,每周,每月访问以便快速检索?

时间:2012-03-10 20:17:02

标签: sql database tsql

我使用的是SQL Server 2008和ColdFusion 9。

我需要登录访问我的网站。这将适用于已登录的用户。我需要能够检索他们本周,今年,今年以及连续几天登录的次数,非常类似于StackExchange的工作方式。我希望能够显示任何月份的日历并显示访问者访问的日期。

我不确定存储此数据或检索数据的最佳方法。我最初的想法是创建一个每日或每周表,记录每个用户的每次点击。我会像这样存储UserID和时间戳。

TABLE_VISITS_LAST_SEVEN_DAYS
UserID     VistitDateTime
101        2012-10-06 01:23:00
101        2012-10-06 01:24:00
101        2012-10-07 01:25:00
102        2012-10-07 01:23:00
102        2012-10-07 01:24:00
102        2012-10-07 01:25:00

在每天结束时,我会确定谁访问了该网站并汇总了访问次数,从根本上删除了重复的信息。因此,我将删除以上数据并将其插入到只存储此数据的表中:

TABLE_VISITS_ALL_TIME
UserID     VistitDate
101        2012-10-06
101        2012-10-07
102        2012-10-07

这些数据很容易查询,不会存储任何不必要的数据。我需要所有数据来确定用户访问我网站的频率,而不需要太多努力。

这是一个好计划吗?有更简单或更好的方法吗?我的计划是否有一个漏洞?我们将不胜感激。

3 个答案:

答案 0 :(得分:1)

为什么不只是存储每次访问,如果您需要每日/每周/任何统计信息创建一个根据需要聚合的查询?这一切都取决于您期望的访问次数以及您希望保留统计信息的时间段。

编辑:

  

听起来你建议设计得不好就好了   只要我有一个快速的服务器。是吗?

这不是我所说的。你的第一个解决方案并不是一个糟糕的解你的第二个解决方案不是“更好”。如果有的话,它会有些非规范化。

没有“最好的方法”去做你所描述的事情。有多种可能的解决方案,其中一些可能足以满足您的需求,而另一些则可能没有。

  1. 如果您对统计信息感兴趣,例如个人用户访问您网站的频率以及每天和每天的次数,您的第一张表会告诉您。这在聚合时会带来一些额外的开销。
  2. 如果您关心的是用户是否在某一天访问了您的网站,为什么不存储该信息呢?在用户当天第一次访问时插入一行,直到明天才再这样做。
  3. 每次访问记录一行的额外开销是否过多取决于您的具体应用。一个每月点击几千次的小网站与像亚马逊这样的大型网站不同。

    此外,有多种方法可以做到第一个解决方案。如何设置索引等等。为什么不这样做,看看它是否有效?创建一个表,插入您认为是典型数据量的内容并尝试一下。如果它不够高效,那么就要担心其他聚合表和夜间工作等等。

      

    ......过早优化是万恶之源。 - 唐纳德克努特

答案 1 :(得分:1)

我不明白这两个表的必要性。第二个是第一个的重复数据删除版本;您执行的任何聚合查询仍然必须执行相同的索引扫描,只需稍微小一点。

我个人认为,如果您创建了第一个表格会更有意义,但在useridvisitdatetime的yyyy-mm-dd部分放置一个唯一索引(尽管visitdate现在可能更合适了)。如果您有重复的条目,请捕获该异常并忽略它。

然后根据定义,您的第一张桌子成为您的第二张桌子,您无需在后台进行任何额外的工作。

这种方法的主要问题是,如果你想计算一天内有人登录的时间,你就不能。

答案 2 :(得分:1)

您可以将TABLE_VISITS_LAST_SEVEN_DAYS中的VisitDateTime列声明更改为VisitDate as Date,然后以这样的方式记录每次访问:

INSERT INTO TABLE_VISITS_LAST_SEVEN_DAYS 
SELECT @UserID, @VisitDate
WHERE NOT EXISTS (
  SELECT 1 FROM TABLE_VISITS_LAST_SEVEN_DAYS (NOLOCK)
  WHERE UserID=@UserID AND VisitDate=@VisitDate
)

(@ VisitDate是日期类型变量)

相关问题