Сразу обговорю один момент. Сделать свою систему счетчиков мне действительно нужно, в каком то плане я изобретаю велосипед, но в поставленной задаче это единственное решение. Разумеется я знаю такие слова как Liveinternet и Google Analytics, мало того, я этим активно пользуюсь. Вообщем я написал код счетчика, написал скрипт который отдает картинку счетчика и берет необходимые параметры из запроса, но тут возникает один вопрос - как грамотно сделать структуру базы для учета посетителей чтобы не было проблем с производительностью, с выборкой данных для графиков и прочее. Какие операции необходимо поддерживать: 1) Узнать количество уников для данного ресурса за текущие сутки 2) Узнать количество просмотров для данного ресурса за текущие сутки 3) Узнать количество уников для данного ресурса за текущий месяц 4) Узнать количество просмотров для данного ресурса за текущий месяц 5) Узнать количество уников для данного ресурса за все время 6) Узнать количество просмотров для данного ресурса за все время 7) Данные для графика - посуточный за текущий месяц 8) Данные для графика - помесячный за все время Изначально для данных счетчика я сделал толко три таблицы. Ниже указаны схемы этих таблиц в интерпретации Doctrine ORM. Код (Text): CounterQuery: columns: id: primary: true autoincrement: true type: integer(10) url: string(2048) resource_id: integer(10) visitor_id: integer(10) query_time: timestamp relations: Resource: Visitor: options: type: INNODB collate: utf8_unicode_ci charset: utf8 Visitor: columns: id: primary: true autoincrement: true type: integer(10) query_time: timestamp visitor_ip: integer(10) relations: CounterQuery: local: id foreign: visitor_id options: type: INNODB collate: utf8_unicode_ci charset: utf8 Resource: columns: id: primary: true autoincrement: true type: integer(10) name: string(255) url: string(2048) resource_ip: integer(10) subscriber_ip: integer(10) registration_date: timestamp account_number: integer(10) description: clob relations: CounterQuery: local: id foreign: resource_id options: type: INNODB collate: utf8_unicode_ci charset: utf8 Как работает сам счетчик, при обращении, берется Cookie, эта кука в зашифрованном виде содержит visitor id, соответственно, если я вижу что такой visitor id есть, то в таблицу counter_query добавляю запись, если куки нет, или кука не валидная (visitor id отсутствует) создаю новый visitor, устанавливаю куку и создаю запись в counter_query. Что получаем: таблицу в которой содержаться все записи запросов счетчика и таблица фактических посетителей. Кука устанавливается на один год. В текущей схеме появились трудности при выборке из базы данных для графиков - по суткам, по месяцам. Так же есть предположение что при серьезных размерах таблицы counter_query запросы будут выполняться очень долго, причем это время будет расти по ходу увеличения таблицы. Что хочеться получить в ходе обсуждения: 1) Конструктивную критику 2) Предложения как сделать грамотно, чтобы в дальнейшем вышепоставленные задачи можно было расширить, например выбрать ядро аудитории за год и т.д. и т.п. P.S. я опустил в описании выше добавление индексов к таблицам - разумеется без этого в данной задаче не обойтись.
В этой задаче без избыточности данных, мне кажется, не обойтись. ИМХО создай ещё таблицы в которых ты будешь хранить конечные статистические данные и раз в определенный промежуток, с крона запускай скрипт который будет обновлять данные в таблицах c готовыми результатами.
Рэкомендую почитать про певую второю и третью нормальные формы - этот подход используется при проэктировании структуры таблиц базы данных и вооще ёё таблиц. Всё найти можно в Google. PHP5 представляет хорошую объектно-ориентрованную среду, так что опереруй классами, проетируя их так что можно бы было расширить функциональность приложения не смотря на структуру базы данных - пользуй адаптеры, преобразователи и т. д. Это тема касается паттернов проектирования. Тоже можно найти в Google