在任何网站上,例如在StackOverflow上,每个问题都有一个视图计数,用户阅读一个问题但之前已经读过它不会计数两次.
我对如何实现它以及使用哪些表来实现它有一些想法.
您认为实施此方法的最佳方式是什么?
我看到你有几个选择.
饼干
您可以在用户浏览器中为要记录视图的每个页面存储cookie.检查此cookie是否存在,如果cookie已存在,则不记录视图.
缺点是,如果禁用cookie或有人试图游戏系统,它将无法工作.
从好的方面来说,您不必担心存储可能数百万/数十亿行的表数据.
数据库
您为每个视图保留一条记录.以某种方式将该记录与用户相关联,例如MemberID,IP Address; 对用户来说应该是唯一的东西.如果您不要求用户登录,IP并不理想,但足够好.
所以你会有一个包含以下列的表,
ArticleID(外键)
用户ID(外键)
日期
由于几个原因,日期将有用,
报告.一旦知道记录每个视图的时间,就可以构建更好的统计数据.
查看超时.例如,您可能只想每个用户每小时存储一个视图.保持日期列,您可以执行此操作.
如果您的应用程序在这种情况下变得流行,那么您将需要处理存储问题.我运行一个流行的Facebook应用程序,每天会添加超过100,000个视图行.实际上,如果你的应用程序如此受欢迎,以至于它成为一个问题,那么你将面临更大的问题需要处理.
在我的网站上,我通过使用随机数划分视图数来处理客户视图和"大量数据".
假设我有一个0到1之间分布良好的随机数生成器,我每天在特定页面上获得100,000个视图.如果我在每个视图中调用'logView()'函数,但在其中生成一个新的随机数,并且当随机数<0.001时才真正将视图记录到数据库中,那么对于100,000个视图,我只会大约点击DB 100,000*0.001 = 1000次.
如果我想返回一个视图计数,那么我只需将我的DB编号除以相同的值,例如.1000/0.001 = 100,000.这近似精确到最近的1000个视图.
显然,您可以根据站点的负载选择随机数范围,如果负载发生显着变化,甚至可以更改此值(您只需相应地修改存储的值).
此外,只有1000个视图的页面在视图计数中甚至可能得不到1,但如果您有一个包含100,000个视图的页面,则1000的视图非常无关紧要.