在数据库表中存储视图计数

时间:2014-03-28 21:53:38

标签: php mysql sql database database-design

每次访问数据库记录时,存储视图计数的适当且最有效的方法是什么?

我的表格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()

2 个答案:

答案 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");
}
?>