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

4

什么是存储数据库记录访问次数的最合适和最有效的方法?

我有一个包含以下字段的表ITEMSid,item_name

每个项目都有自己的永久链接:http://domain.com/item_name

我想能够使用这些数据并在页面上显示浏览量: 2,938。哪种方法最好?


A方法

ITEMS表中创建一个附加字段view_count,并将其更新以增加视图计数:

view_count = view_count + 1;

方法B

创建一个名为VIEWS的新表格,包含以下字段:

id, item_id, timestamp, ip

每次查看页面时,将添加一个新记录到VIEWS表中。

方法C

是否有另一种方法?


我已经看到在各种PHP论坛软件中使用了方法A,但我的大学教师告诉我,方法B更好,因为add() update()需要更少的压力。


1
如果你仅仅需要一个视图计数,那么使用方法B,如果你有成千上万的访问者,在表格上执行count()会有多大的压力呢?相反,如果你要使用最后一个id来获取总浏览量,那么存储其他信息有什么意义呢?所以我认为方法A是两种方法中更好的选择。 - phpLearner
2个回答

5
“插入”操作通常比“更新”语句更节约资源,但是精调过的“更新”语句并不一定会给系统带来压力。此外,还有其他考虑因素。如果唯一已知和预见的需求是“总”页面计数,则单行占用的存储空间要比为每个“视图”事件存储单独行低得多。而且,检索视图计数的查询将更加高效。
(真正的压力在于存储,而不仅仅是磁盘空间,在备份所需的磁带数量、时间,恢复所需的时间等方面也有影响。)
如果需要按小时或按天报告视图情况,则具有更细粒度的数据将为您提供这样的能力,而您无法从总数中获取该信息。
您实际上可以同时进行两种操作。
如果我需要一个“摘要”计数以放在页面上,我不想每次查看页面时都运行针对历史事件记录的大量行的查询,只为了得到下一次查看时的新值2,939。从单个行中检索单个列值比在数千行事件数据中聚合它来计算更少地占用数据库资源。
如果我还需要能够根据国家、IP地址、按小时、每日或每周或每月报告“视图”,那么我还将存储单个事件行,以便在分析中进行切片和切块。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接