我有一张表article
,里面有很多文章。我想跟踪每篇文章的观看者数量。这是我的想法,我打算如何做到这一点。
我的表viewers
包含行:id
,ip
,date
,article_id
。
article_id
是FOREIGN FIELD
,指的是文章的id
。因此,当用户打开文章时,他/她的IP地址存储在表格中。
这是一个不错的方法吗?这是一个个人网站,而不是一个非常大的网站。
编辑:我想打印每个文章页面上的观看次数。
答案 0 :(得分:1)
这取决于您需要显示查看器数量的频率。您的一般查询将是:
select count(*) from viewers
where article_id='10'
随着时间的推移,您的viewers
表格会增长。假设它在一年或两年后有百万条记录。现在,如果您在每个文章页面上显示多个查看者或显示包含大多数查看者的文章,即使外键被编入索引,它也会开始影响性能。但是,在您添加数百篇文章后,会发生这种情况,每篇文章都有数千名观众。
更好的优化解决方案可能是在文章表中保留观众数量并使用它来显示结果。现有的查看者表也是必要的,以确保没有重复的条目(读取文章十次的同一用户必须标记为单个条目而不是十个)。
答案 1 :(得分:1)
使用Google Analytics等工具。这将使工作更加精细,您可以在几分钟内启动并运行,有更多关于唯一身份访问者而不是IP地址!
如果你想拥有一个内部部署的解决方案,请查看PIWIK,这就是这个puprose的PHP框架。
答案 2 :(得分:0)
在这种设计中,如果同一个用户一次又一次地打开它,则会出现一个问题,那么要么在插入条目之前必须进行检查,要么多次插入相同的IP地址但不同的时间戳。
大多数热门网站都将一个IP地址视为一个视图,即使该客户端或用户多次打开该文章也是如此。
我能想到解决方案。
答案 3 :(得分:0)
这取决于您要在数据库中存储的内容。如果您想确切知道访问此特定文章的唯一用户数(包括日期和IP),这是合理的方法。但是,如果您只需要一个数字来显示您可以更改文章表并包含带有visit_counter的新列并存储cookie以防止在同一用户上增加计数器。
答案 4 :(得分:0)
尝试这样的事情
// insert
$query = mysqli_query("REPLACE INTO viewers (ip) VALUES ('" . ip2long($_SERVER['REMOTE_ADDR']) . "')");
// retrieve
list($pageviews) = mysqli_fetch_row(mysqli_query("SELECT COUNT(ip) FROM viewers"));
echo $pageviews;
阅读:REPLACE INTO
答案 5 :(得分:0)
是的,如果您创建某种缓存来显示每篇文章的视图数量,这是很好的方法。每次用户打开网站时计算视图都不是最佳选择。
您可以在SQL Server中执行此操作。有类似materialized view
的东西。 (https://code.google.com/p/flexviews/)
select article_id, count(*) as views from viewers group by article_id
或者您可以将其缓存在文件中并每隔X次刷新一次。
存储查看我建议使用AJAX的文章的用户。当用户打开网站时,另一个“线程”会调用网站将其添加为查看者。即使您的数据库速度很慢,也不会减慢网站加载速度,也不会计算网络蜘蛛。