Сохранение количества просмотров в таблице базы данных

Каков подходящий и наиболее эффективный способ хранения количества просмотров каждый раз, когда доступ к записи базы данных?

У меня есть таблицы ITEMS содержащие следующие поля: id, item_name

У каждого элемента есть своя постоянная ссылка: http://domain.com/item_name

Я хотел был бы иметь возможность использовать эти данные и отображения данных Views: 2,938 на странице. Какой метод лучше?


Способ A

Создайте дополнительное поле view_count в таблице ITEMS и обновите его, чтобы view_count количество просмотров:

 view_count = view_count + 1; 

Способ B

Создайте новую таблицу VIEWS содержащую следующие поля:

 id, item_id, timestamp, ip 

И добавьте новую запись в таблицу VIEWS каждый раз, когда просматривается страница.

Способ С

Есть ли другой метод?


Я видел метод A, используемый во множестве программных форумов PHP, однако мои преподаватели университета сообщили мне, что метод B лучше, потому что add() требует меньше напряжения, чем update()

Верно, что операция INSERT часто потребляет меньше ресурсов, чем инструкция UPDATE; но хорошо настроенный оператор UPDATE не обязательно является напряжением ».

Есть и другие соображения. Если единственным известным и ожидаемым требованием является «общий» подсчет страниц, тогда одна строка будет потреблять гораздо меньше памяти, чем сохранение отдельных строк для каждого события «просмотра». Кроме того, запросы на получение количества просмотров будут намного эффективнее.

(Где «напряжение» находится в реальном мире в хранилище, а не просто на диске, но количество лент и количество часов, необходимое для резервного копирования, время, необходимое для восстановления, и т. Д.)

Если вам нужно иметь возможность сообщать о просмотрах по часам или по дням, то наличие более подробных данных даст вам возможность сделать это, чего вы не можете получить от всего.

Вы могли бы сделать и то, и другое.

Если бы мне понадобилось «итоговое» количество, чтобы поместить эту страницу, я бы не захотел запускать запрос с лодкой строк в исторической записи событий, просто чтобы придумать новое значение 2939 в следующий раз, когда страница рассматривается. Было бы гораздо меньше «напрягаться» по ресурсам базы данных, чтобы получить одно значение столбца из одной строки, чем было бы опрокидывать тысячи строк данных событий, чтобы агрегировать их в счет, каждый раз, когда просматривается страница ,

Если бы мне также нужно было административно сообщать «взгляды» по странам или по IP, по часам, дням или неделям или месяцам, я бы также сохранил отдельные строки событий, чтобы они были доступны для анализа фрагментов и кубиков.

есть еще один способ, чтобы вы могли получить уникальный 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"); } ?>