Вести рейтинг самых популярных материалов на сайте

Spear

почемучка
Вести рейтинг самых популярных материалов на сайте

Добрый вечер,
у меня вознкла такая проблемка6
нужно вести рейтинг самых популярных материалов на сайте,
по возможности избежать увеличения рейтинга путем зажатия клавиши F5.
Я долго думал но так и не смог придумать схему, которая бы учитывала реальную посещаемость такой-то статьи.
Просто сделать при загрузке статьи "update * set counter=counter+1" конечно не подходит.
Я буду очень благодарен, если кто-нибудь уже занимался подобным и сможет подсказать мне в каком направлении думать.
Благодарю за внимание.
 

Денч

Новичок
Кукисы не годятся? Хотя как ни крути, а точный рейтинг не определишь...
 

kruglov

Новичок
можно вести список ipшников.
потирать из него те, кто старее ну к примеру часа

-~{}~ 20.10.05 23:49:

disclaimer:
Накрутить при желании можно все. Даже то, где надо паспорт предъявлять.
 

Spear

почемучка
Денч
совсем отчного рейтинга не нужно (то есть вести кол-во уникальных посетителей не обязательно),
ведь если юзер заходил на эту страницу даже 50 раз - значит она ему нужна. Другой вопрос - заходил ли он, или просто зажал Ф5.

Была такая идея - ставить сессию, например:
айди_статьи:время
(то есть - был, читал)
И если такой сессии нет - то обновлять счетчик.
И все бы хорошо - ведь и Ф5 не навредит, и Айпи не блокируем (временно).
Но есть одно и очень весомое НО:
если юзер зашел на страницу первый раз,то ко всем ссылкам у него добавится айди сессии (даже если куки включены).
Конечно на последующих страницах этого не будет. но тем не менее - такое есть.

-~{}~ 20.10.05 23:59:

можно вести список ipшников.
потирать из него те, кто старее ну к примеру часа
то есть на странице статьи сначала выбирать из таблицы айпишников Айпи строку в которой есть айпи этого пользователя и айди этой статьи? и, если есть, то return;
а если нет, то insert in ArticleRates ...
и
delete from articleRateIps... where time ... ?
не будет л это очень напряжно?
 

Spear

почемучка
kruglov
даже если учесть что помимо всего прочего уже испольщзуется 8-10 запросов?
ок
спасибо.
А ещё могут быть какие-либо варианты?
 

kruglov

Новичок
Этот самый нересурсоемкий, IMHO

-~{}~ 21.10.05 00:41:

p. s. потирать можно, например, если
if(random()<0.01)
 

Spear

почемучка
p. s. потирать можно, например, если
if(random()<0.01)
сори,
вобще не понял:) То есть что бы не потирать каждый раз? ну впринципе проект доволльно-таки крупный,
думаю что мусор будет крон убирать :)
 

Spear

почемучка
попутный вопрос - ещё желательно сделать "популярное на этой неделе" - не подскажете, как лучше?
то есть у меня уюже (предположим) есть таблица, в которой хранятся записи, каждая запись которой соответствует 1му "уникальному" (назовем это так) просмотру статьи.

например
module (news, content, etc.) | article_ID | date

1 | 3 | 2005-10-10
1 | 3 | 2005-10-10
1 | 3 | 2005-10-10
1 | 4 | 2005-10-10
1 | 5 | 2005-10-10

то ест выбираем из этой базы count полей article_Id Where module = '1' and date='$today' order by count_id - и получам что в модуле номер 1, статя под номером 3 была просмторема столько-то раз за сегодня.
получаем самые-самые топовые статьи за сегодня.
А что бы не засорялась таблица, раз в сутки удаляем из неё все записи у которых дата !== сегодня.
Впринципе все понятно,
НО как,например, показать самые популярные статьи за неделю?
неделя, скорее всего, будет подразумевать не "сегодня минус 7 дней" а реально неделю. То есть ,например, сегодня неделя 17 октября (с понедельника).

Вот я непойму никак, как подсчитать. то есть как подсчитать - я понимаю, но для этого нельзя чистить таблицу статистики каждый день. А если не чистить.. вобщем у сайта сейчас посещаемость 1к, и таких записей в статистике (только я немного по другому сделал - сделал как я показывал пример - с сессиями) - порядка 2,5к в сутки. И это пока что я только в одном модуле сделал, да и посещаемость пока что не очень.

И, например, при 4к посетителей в день будет формироваться 10к записей, за неделю - 70 000. Отсюда вопрос - насколько это плохо для базы?
прошу учесть, что статистика по самым популярным не будет выбираться каждый раз при обновлении старницы, а будет обновляться раз в... 4 часа. Думаю хватит. То есть запросов к ней будет - не от силы 10 в сутки (если интервал уменьшу).
Тут самый главнй вопрос - стоит ли делать именно ТАК, (70 000 записей, и потом из всех них считать популярное за неделю) или можно придумтаь что-то более извращенное, но менее ресурсоемкое (ресурс - база).
Прошу заметить - пока что я говорил об одном модуле.
Представим себе что будет крупная посещаемость (все-таки, е хотелось бы расчитывать движок сайта на мелкую аудиторю) и работать статистика будет в 5 модулях.
Итого, размер таблицы статистики будет под пол-миллиона записей (а то и больше).
И это лишь статистика.
А т.к. статей и материала тоже будет не мало - то вся база рискует вырости до невероятных размеров.
Стараюсь, конечно, делать правильные запросы, ставить индексы там, где они нужнеы и т.д.
но все же.

пс
Если вы прочитали мой пст - спасбо огромное. Я уже писать устал, а вы все это читали. Буду ещё более признателен за советы :)
 

Steamroller

Новичок
Spear, ну варианты разные могут быть.
Например, можно держать отдельной таблицей данные о том, какую статью за какой день сколько раз запрашивали. Соответственно, для того чтобы получить текущую цифру - надо в этой таблице просуммировать записи за предыдущие 6 дней, и просуммировать за сегодня и добавить туда. Правильнее даже сначала посчитать сегодняшнюю цифру на основе сырых данных, и потом сложить из таблицы с суммарными данными 7 записей.

По поводу производительности. Если ты раз в 4 часа будешь гонять суммирующий запрос по таблицам в сумме имеющим 500000 записей, то это фигня, не стоит даже волноваться.
 

kruglov

Новичок
Для каждой статьи можно иметь 7 записей в таблице популярности и при посещении писать туда +1 в сегодняшнюю.

А крон раз в сутки пусть удаляет ранние записи теперь уже старше недели.

Имеем популярность статьи за 7 последних дней. Ну а просуммировать - уже чисто техническая задача.

Это если "за неделю" === "за последние 7 дней", а не "с понедельника"
 
Сверху