Sql “最佳存储方式”;“意见”;论题

Sql “最佳存储方式”;“意见”;论题,sql,statistics,Sql,Statistics,我使用此代码更新主题的视图 UPDATE topics SET views = views + 1 WHERE id = $id 问题是,用户喜欢通过发送垃圾邮件来获得荒谬的浏览量 我应该如何获得独特的点击率?在存储IP的位置创建一个新表? 我不想把它储存在饼干里。清除cookies太容易了。我会创建一个单独的表来存储这些信息。然后,您可以捕获大量数据,而不需要更新可能读取最多的表 您将始终使用INSERT INTO tblTopicViews 而且,您希望尽可能多地捕获信息,IP地址,点

我使用此代码更新主题的视图

UPDATE topics 
SET views = views + 1 
WHERE id = $id
问题是,用户喜欢通过发送垃圾邮件来获得荒谬的浏览量

我应该如何获得独特的点击率?在存储IP的位置创建一个新表?
我不想把它储存在饼干里。清除cookies太容易了。

我会创建一个单独的表来存储这些信息。然后,您可以捕获大量数据,而不需要更新可能读取最多的表

您将始终使用INSERT INTO tblTopicViews

而且,您希望尽可能多地捕获信息,IP地址,点击日期和时间,可能还有一些关于浏览器版本、操作系统等的信息,只要您能掌握。这样,您就可以微调过滤刷新请求的方式


值得注意的是,许多用户可以共享一个IP—例如,整个办公室可能通过同一个路由器。

好的,您可以将单个页面点击写入日志表,包括烹饪或IP地址等标识信息。你可以随意分析那张桌子

但是web服务器可能有这样的功能。我知道IIS和Apache都可以创建详细的使用日志。对于这两种情况,都有各种各样的绘图和分析工具,可以将IP地址之类的内容考虑在内


因此,您可以使用web服务器,而不是滚动自己的日志记录。

我将创建一个存储独特视图的表:

CREATE TABLE unique_views(
    page_id number,
    user_agent varchar2(500),
    ip_address varchar2(16),
    access_time date,
    PRIMARY KEY (page_id, user_agent, ip_address, access_time)
)
现在,如果有人访问该页面,并且您希望允许每个用户每天查看一次,您可以这样做

INSERT INTO unique_views (:page_id, :user_agent, :ip_address, trunc(SYSDATE, 'day'))
这将不允许同一用户在一天内重复查看。然后,您可以通过一个简单的分组来计算每个页面的浏览量(例如今天的浏览量):


您可以使用session_id()来区分不同的用户,显然您需要一个单独的表来跟踪每次访问


更新:我刚刚注意到您不想依赖cookies,因此这可能不适合您。

请注意,由于各种问题(例如缓存服务器的未知行为),这种事情总是不准确的,并且会在各种因素之间取得平衡。然而,对于一个粗糙而模糊安全的柜台,使用卡尔·巴特尔和其他人建议的单独桌子是一个不错的解决方案

然而,取决于你对这个问题的重视程度,你可能想省去“用户代理”-这很容易伪造,所以如果我真的想膨胀我的点击计数器,我可以使用一个脚本来收集点击,该脚本使用user agent=“bot1”调用我的页面,然后再次使用“bot2”从同一IP访问,等等


但是,一个IP后面的两个用户只会被算作一次点击,所以你会失去准确性-明白我说的各种因素之间的平衡是什么意思吗?

+1创建一个单独的表是一种方法,这样就不会影响主站点的性能
SELECT page_id, count(*) page_views
FROM unique_views
WHERE access_time = trunc(SYSDATE, 'day')
GROUP BY page_id