我正在开发一个有200.000页的网站。还有一个浏览部分,显示最受欢迎,评价最高等文件。然而,在发布之后,这一部分将在几周后变得几乎静止。所以我也希望实现一个过滤系统,它将显示今天本周最受欢迎的产品,就像youtube一样。
就像这样:
http://www.youtube.com/videos?c=2
我该如何实现这个功能?我是否需要另一张桌子,每天都会为每个文件添加一个新条目?
docid,date,view_count,rating
因此,我将通过使用一天来获取今天的过滤行,或者使用周计算一周(7行)进行过滤?看起来效率不高。你有什么建议吗?
我顺便使用LAMP堆栈。
谢谢,
答案 0 :(得分:1)
假设您为表中的记录加时间戳,您应该能够将where子句限制为将时间戳限制为您想要的任何时间范围。
您可以将结果缓存,特别是较长的结果,以便使请求无关紧要。
修改
但也许你的意思是今天最流行,而不是今天最流行的?
在这种情况下,我没有答案。
答案 1 :(得分:1)
最直接的方法是每次在recent_views(what, when)
中显示资源时保存时间戳和资源ID。可以使用WHERE when > $beginOfPeriod AND when < $endOfPeriod
等适当的WHERE子句创建每日/每周/每月图表。
出于性能原因,您可以每晚汇总值,将总和保存在单独的表中,如daily_views(what, sum)
并截断源表。
答案 2 :(得分:0)
我想我会在代码中计算日期,然后将它们作为参数传递给您正在使用的SQL。
答案 3 :(得分:0)
我会用编译器来做。考虑到流量和响应时间,Youtube也可能也这样做。
原则很容易理解。您可以在page_view
表中记录每个视图或评级。您可以定义编译发生的时间段(每小时,每天,每周,每月)。每当你遇到好时光时(例如:当天结束),你执行编译器,它基本上执行查询à-la ...
SELECT * FROM page_view WHERE date > $from_date AND date < $to_date
...并存储结果。这可能在cron工作中效果更好。
下次需要显示信息时,您只需获取存储的结果并显示即可,无需重新计算。您可以使用多种存储方法:MySQL表(例如:page_view_compiled
),memcached等。