1 建立两个表,一个表只记录当天的点击量,比如today_cnt,字段:`id`,`time`(用unix时间戳形式)你可以用内存表或临时表,但一定要注意这两种表的特性,防止因服务器问题导致数据丢失。2 每当有一个下载,就把相应的值插入到today_cnt这个表里面。3 写一个php或perl脚本如exec.php,根据today_cnt里面的值,格式化time字段,将日期及统计出的下载次数插入到一个新的结果表total_cnt中。字段:`id`,`date`,`cnt`,并且在将结果写入到total_cnt之后,清空today_cnt表。4 使用crontal每天定时执行exec.php5 前台查询模块
(1)本日数据直接查询today_cnt表得到结果。
(2)本周数据从total_cnt根据date字段匹配出对应id的本周数据加上today_cnt表对应id的数据量。
(3)本月数据从total_cnt根据date字段匹配出对应id的本月数据加上today_cnt表对应id的数据量。
(4)数据总量从total_cnt根据date字段匹配出对应id的所有数据加上today_cnt表对应id的数据量。
如果你会分析apache日志,直接从日志里面提取出下载的原始记录来统计会更好。

解决方案 »

  1.   

    这两个设计方法各有优劣……我个人比较喜欢第一种。能够少写冗余数据就少写一些。而且,你的统计毕竟只是一个基于不同时间段的count操作而已,不是很复杂,所以我喜欢第一种……当然,这样设计的缺点就是每次显示一个产品时,其下载次数都要重新计算,而不是直接select出来,速度会慢一些,但应该不是不能接受。第二种是所谓的持续更新,在你的业务逻辑中要控制的比较严格,因为牵涉到大量的冗余数据的更新。比如,每个月月初就要清除“当月”下载量之类的sweeping。但是它的好处是一次查询可以返回所有需要的数据。速度会提高一些。采用第二种的设计我也用过,那是在我早期设计一个非常复杂的统计时“偷懒”用的。那个统计需要统计时间段、地域、各品种、各销售的销售情况,为了避免写很大的SQL语句,就偷懒了一下用了一个冗余表。现在回想起来,觉得还是用第一种方法好。