每次访问数据库记录时,存储视图计数的适当且最有效的方法是什么?
我的表格ITEMS
包含以下字段:id, item_name
每个项目都有自己的永久链接:http://domain.com/item_name
我希望能够使用此数据并在页面上显示Views: 2,938
。哪种方法最好?
方法A
在view_count
表格中创建一个额外的字段ITEMS
并更新它以增加查看次数:
view_count = view_count + 1;
方法B
创建一个包含以下字段的新表VIEWS
:
id, item_id, timestamp, ip
每次查看页面时,都会在VIEWS
表中添加新记录。
方法C
是否还有另一种方法?
我已经看到在各种PHP论坛软件中使用的方法A,但是我的大学教师告诉我方法B更好,因为add()
需要的压力小于update()
答案 0 :(得分:3)
INSERT操作通常比UPDATE语句消耗更少的资源;但调整得很好的UPDATE语句不一定是“。”
还有其他考虑因素。如果唯一已知和预见的要求是“总”页数,那么单行将比为每个“视图”事件存储单独行消耗更少的存储空间。此外,检索视图计数的查询效率会更高。
(现实世界中的“应变”存储在存储中,而不仅仅是磁盘空间,而是磁带数量和备份所需的时钟量,恢复所需的时间等)< / p>
如果您需要能够按小时或按天报告观看次数,那么拥有更精细的数据将为您提供执行此操作的功能,而这些功能是您无法从中获得的。
你实际上可以做到这两点。
如果我需要一个“摘要”计数来放置页面,我不希望必须对历史事件记录中的一大堆行运行查询,只是为了在下一个中提出新值2,939查看页面的时间。每次查看页面时,从单个行检索单个列值的数据库资源的“压力”要小于通过数千行事件数据进行流失以将其聚合为计数的情况。
如果我还需要能够按国家/地区,按IP,按小时,按天或按周或按月管理报告“观看次数”,我还会存储各个事件行,以便将它们用于切片和骰子分析
答案 1 :(得分:0)
还有另一种方法可以获得独特的IP ..这将对您有所帮助:http://codebase.eu/source/code-php/ip-counter/
但如果您想将其存储在数据库中,请告诉我这是否适用于您:
CREATE TABLE `counter` (
`file` VARCHAR(200),
`time` VARCHAR(20),
PRIMARY KEY (`file`)
);
并创建counter.php
<?php
//read the name of your page
$file=$_SERVER['PHP_SELF'];
//connect to database
mysql_connect("dbhost","dbuser","dbpass");
mysql_select_db("dbname");
//database check
$sql=mysql_fetch_array(mysql_query("SELECT * FROM `counter` WHERE `file` = '$file'"));
if ($sql)
{
//if there is data - it will add one
$add_counter=mysql_query("UPDATE `counter` SET `time` = `time` + 1 WHERE `file` = '$file' LIMIT 1");
}
else
{
//if empty - it will create one
$add_data=mysql_query("INSERT INTO `counter` (`file`,`time`) VALUES ('$file','1')");
} ?>
然后把它显示给你的柜台
<?php
//connect database
mysql_connect("dbhost","dbuser","dbpass");
mysql_select_db("dbname");
//show array from database
$sql=mysql_query("SELECT * FROM `counter` ORDER BY `file` ASC");
while ($data=mysql_fetch_array($sql))
{
echo ("This ".$data['file']." Get ".$data['time']." Views");
}
?>