2012-03-10 62 views
1

我正在使用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 

这个数据是很容易地查询,也不会存储任何不必要的数据。我将拥有所有需要的数据来确定用户访问我的网站的频率,但费用并不高。

这是一个很好的计划吗?有没有更容易或更好的方法?我的计划是否有漏洞?想法将不胜感激。

回答

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 [email protected] AND [email protected] 
) 

(@VisitDate为Date类型变量)

+0

我认为你的答案非常简单明了。谢谢!!! – 2012-03-20 15:35:13

+0

欢迎:) – 2012-03-20 23:22:08

1

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

编辑:

这听起来像你的意思是不好设计它只是罚款 只要我有一个快速的服务器。是对的吗?

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

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

  1. 如果您对统计数据感兴趣,比如每个用户访问您的网站的频率以及每天和几次访问您的网站的次数,您的第一张表格会告诉您。这在进行聚合时会带来一些额外的开销。
  2. 如果您一直关心的是用户是否在特定的日子访问过您的网站,为何不储存这些信息?在当天第一次访问时插入一行,直到明天才再次访问。

每次访问记录一行的额外开销是否太大取决于您的具体应用。一个每月获得几千次点击的小型网站与亚马逊这样的大型网站并不相同。

此外,即使是第一个解决方案也有多种方法可以完成。如何建立索引,等等。为什么不这样做,看看它是否有效?创建一个表格,插入你认为是典型的数据量并试一试。如果性能不够好,那么担心其他汇总表和夜间工作等。

...过早的优化是一切罪恶的根源。 - 高德纳

+0

你是在暗示第一张桌子的想法是正确的,第二张桌子是不必要的? – 2012-03-10 20:50:20

+0

是的。在成为问题之前,不要花太多时间担心绩效。或者更好的是,将合理数量的数据插入这样一个表中并对其进行测试。 – eaolson 2012-03-10 21:14:26

+0

这听起来像你的意思是不好设计它只是罚款,只要我有一个快速的服务器。是对的吗? – 2012-03-10 23:31:33

1

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

我个人认为这会更有意义,如果你创建了第一个表,但是穿上userid唯一索引和visitdatetime(虽然现在visitdate可能更合适)的YYYY-MM-DD的一部分。如果您有重复的条目,请捕获异常并忽略它。

那么你的第一个表成为你的第二个定义,你不需要做任何额外的工作背景。

这种方法的主要问题是,如果你曾经想算时间的人的数量在一个单一的一天,你不能登录。

+0

如果平均用户点击十页,该表将存储十大金曲,当我真的只需要一个。十次不会稍大一点。你是建议只使用一个表,但删除“冗余”记录? – 2012-03-11 01:18:15

+0

@EvikJames,不完全;我建议你永远不要将其他9条记录放到数据库中。强制的唯一约束/主键应该为你完成这项工作。 – Ben 2012-03-11 01:20:49

+0

我从来没有这样做过。我明天会读到它。感谢您的建议。 – 2012-03-11 02:06:30