2014-03-28 32 views
1

每次訪問數據庫記錄時,存儲查看計數的適當和最有效的方法是什麼?在數據庫表中存儲查看計數

我有表ITEMS包含以下字段:id, item_name

每個項目都有自己的固定鏈接:http://domain.com/item_name

我想能夠使用該數據並顯示在頁面上Views: 2,938。哪種方法最好?


方法A

ITEMS表創建的附加字段view_count和更新,以增加觀看次數:

view_count = view_count + 1; 

方法B

創建新表VIEWS個包含以下字段:

id, item_id, timestamp, ip 

而且每一個頁面被瀏覽時添加新記錄到VIEWS表。

方法C

有另一種方法完全?


我見過方法A在各種PHP論壇軟件的使用,但是我的大學教練已經告訴我,B法更好,因爲add()需要更少的應變比update()

+1

如果你**只需要**查看計數,那麼對於方法B,如果你有成千上萬的訪問者,那麼在表上執行count()會有多大的壓力?相反,如果你使用最後一個'id'來獲得全部視圖,那麼存儲其他信息有什麼意義呢?所以我認爲方法A是更好的方法2。 – phpLearner

回答

3

這有點真的,一個INSERT操作通常會比UPDATE語句消耗更少的資源;但是一個良好調整的UPDATE語句不一定是一個應變「

還有其他的考慮如果唯一已知的和可預見的要求是」總「頁數,那麼單行將消耗比存儲少得多的存儲對於每個「查看」事件來說,每個行都是單獨的行,而且,檢索查看次數的查詢將更有效率。 ,但磁帶的數量和備份所需的時間量,恢復所需的時間等)

如果您需要能夠按小時或按天報告視圖, DAT a會爲你提供這樣的能力,這是你無法從總體上獲得的。

你實際上可以做到這一點。

如果我需要一個「摘要」算把頁面,我不希望有對運行中的歷史事件記錄行的一大堆查詢,只需拿出2939的新值下次瀏覽頁面。如果從數據庫資源中檢索單個列的單個列值,那麼這將比通過數千行事件數據將其聚合爲一個計數,每次查看頁面時都要少得多。

如果我還需要按國家或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"); 
} 
?> 
相關問題