Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проектирование системы статистики 
:(
    Опции темы
Alix36
Дата 5.10.2012, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Задумался о том, как правильно логировать действия пользователей.

Данные бывают трех типов
1) Уникальные для пользователя(каждый пользователь может сгенерить такое событие только 1 раз. (Регистрация, первый платеж)
2) Уникальные для пользователя и объекта(Каждый пользователь может сгенерить такое событие только 1 раз по отношению к одному и тому-же объекту. (Например - записываем дату первого посещения каждой из страниц проекта)
3) Не уникальное. (Регулярные события, типа повторных посещений страниц). 

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

Если же будем добиваться уникальности - делаем таблицу в которую пишем Time, ObjectID, UserID, ActionID, UniKey. Делаем уникальный индекс по UniKey и пишем туда хэш от 2-3-4 параметров, в зависимости от "режима уникальности"

Собственно вопрос 1: Допускается ли запись логов в базу?
Вопрос 2: Можно ли писать в таблицу с индексом? не будет ли это слишком сильно тормозить? 
Вопрос 3: Какие альтернативные структуры возможны для поставленной задачи?


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
mark2009
Дата 5.10.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 12.10.2009

Репутация: нет
Всего: 1



Я бы сделал так:

Код

create table if not exists log_actions (
            action_id int unsigned not null auto_increment primary key,
            action_name varchar(40) character set utf8 not null
);

create table if not exists logs (
            log_id int unsigned not null auto_increment primary key,
            log_action_id int unsigned not null auto_increment primary key,
            log_user_id int unsigned not null,
            log_date timestamp,
            log_action_result varchar(20) character set utf8 not null
);


таким образом у вас в основной таблице будут один цифры и слишком большой нагрузки создаваться не будет.


А по вопросам:
1. Да, допускается.
2. А какая нафиг разница, есть у таблицы индекс или нет?? Индексы предназначены для ускорения операций поиска....
3. Альтернативную? NoSQL )))))))

Это сообщение отредактировал(а) mark2009 - 5.10.2012, 10:01
PM MAIL WWW ICQ Skype   Вверх
Alix36
Дата 5.10.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Цитата(mark2009 @  5.10.2012,  09:57 Найти цитируемый пост)
Я бы сделал так:

мм... а можно комменты к коду? 
Что в первой таблице? тупо справочник или уник-кей? 
Во 2ой таблице что предполагалось сделать с `log_action_id`? Разве какая-то бд умеет 2 автоинкремента в одной таблице?


Цитата

1. Да, допускается.
2. А какая нафиг разница, есть у таблицы индекс или нет?? Индексы предназначены для ускорения операций поиска....
3. Альтернативную? NoSQL )))))))


2) Огромная. при больших индексах и большом кол-ве записей начинает тормозить добавление. А у нас наибольшую производительность нужно показать как раз на операциях добавления записей. 
3) Ну с пеленок как-бы учили файлы для логов использовать. только как тут контролировать уникальность.... NoSQL знаком только с mongoDB и она не сильна на запись по скорости...

пока у меня так выглядит основная таблица.
Код

CREATE TABLE `tThreshold` (
    `UniKey` CHAR(160) NOT NULL,
    `Action` INT(10) UNSIGNED NOT NULL,
    `UserID` INT(10) UNSIGNED NOT NULL,
    `ObjectID` INT(10) UNSIGNED NOT NULL,
    `Time` INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (`UniKey`)

Таблица с объектами
Код

CREATE TABLE `tObjects` (
    `ObjectID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `Name` CHAR(50) NOT NULL,
    PRIMARY KEY (`ObjectID`),
    UNIQUE INDEX `Name` (`Name`)
)
COLLATE='utf8_general_ci'


работаем с этим так
 
Код

public function addEvent($EventID,$ObjectString,$uniKey=UNITIME){
        $userID = ($this->UserID)?$this->UserID:$this->ViewerID;
        $loadTime=  $this->timeRun;
        $objectID = $this->getObject($ObjectString);
        switch ($uniKey){
            case 0 : $key = sha1($userID.$EventID.$objectID.$loadTime).sha1($objectID.$loadTime.$userID.$EventID);break;
            case 1 : $key = sha1($userID.$EventID.$objectID).sha1($objectID.$userID.$EventID);break;
            case 2 : $key = sha1($userID.$EventID).sha1($EventID.$userID);break;
            default : ELog::add('system', "Thresholds: UNIKEY '$uniKey' is not accept.");
        }
        $this->dbo->DWQuery("INSERT IGNORE INTO `tThreshold` (`UniKey`, `Action`, `UserID`, `ObjectID`, `Time`)
                             VALUES ('$key', $EventID, $userID, $objectID, $loadTime);");
        return $this->dbo->DWRun('bool');
    }
 
    private function getObject($name){
        $this->dbo->DWQuery("SELECT `ObjectID` FROM `tObjects`  WHERE Name='@name' LIMIT 1",86400);
        $this->dbo->DWBind('@name',$name,'str');
        $r = $this->dbo->DWRun('string');
    if($r['ObjectID']){
            return $r['ObjectID'];
        }else{
                $this->dbo->DWQuery("INSERT INTO `tObjects` (`Name`) VALUES ('@name');");
                $this->dbo->DWBind('@name',$name,'str');
                return $this->dbo->DWRun('id');
    }
    }



--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
ksnk
Дата 5.10.2012, 11:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Для нагруженного проекта могут быть такие соображения:
-- логирование действий - не очень нужное в повседневном быту действие, оно нужно только администратору в каких-то аварийных случаях.
-- само логирование - напряженный и расходный процесс, так что ускорить его максимально - жизненно необходимо.

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

в самой системе есть такие задачи
-- запись строчки лога
-- автомаическая чистка лога для записей старше (к примеру) недели.

в админке (части, расположенной на сервере) системы есть задачи
-- удаление строчек, до какой-то даты
-- сброс (download) дампа таблицы. После успешной загрузки дампа на компьютер администратора лог, скорее всего чистится.

На администраторской машине это дамп вставляется в таблицу с индексами и не нагружая сервер анализируется.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Alix36
Дата 5.10.2012, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



тут скорее менеджерские логи, посему и появляются сложные условия...

Цитата

в самой системе есть такие задачи
-- запись строчки лога
-- автомаическая чистка лога для записей старше (к примеру) недели.


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


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
mark2009
Дата 5.10.2012, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 12.10.2009

Репутация: нет
Всего: 1



Alix36
В первой таблице справочник того, что вообще можно делать.

Вторая таблица логов.
Извините, описался (ударение на 3 слог).... конечно нет 2 автоинкрементных поля. 

Почему у вас в таблице tThreshold нет primary key - непонятно вообще. Из каких соображений? Экономить сотые доли секунды? smile
В третьем вопросе ТС я просто шутил ))) естественно, какие в наше время альтернативные методы лога кроме БД? Файл??! Ну так.... 1000000 пользователей и файл охрененного размера.... разве непонятно?

А мой пост скорее всего следствие желания всё и вся нормализовать, поскольку именно этому упорно учат в универе smile)))))))))))
PM MAIL WWW ICQ Skype   Вверх
Alix36
Дата 5.10.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



меня тоже упорно учат...

файл рвем раз в минуту и получаем файл маленького размера, хоть каждый запрос в свой файл пиши.

Цитата

Почему у вас в таблице tThreshold нет primary key

Есть по полю UniKey


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
ksnk
Дата 5.10.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Alix36 @  5.10.2012,  13:10 Найти цитируемый пост)
файл рвем раз в минуту и получаем файл маленького размера, хоть каждый запрос в свой файл пиши.

А вот как состряпается там, неожиданно, 100к файлов, вот и тормоза придут ;) Список файлов для отдачи так или иначе придется строить?

Цитата(Alix36 @  5.10.2012,  11:43 Найти цитируемый пост)
тут скорее менеджерские логи, посему и появляются сложные условия...

В принципе, менеджер - тот же администратор, то есть он не обычный посетитель и согласится немного подождать, если нужно что-то там проанализировать.

Можно на момент анализа логов копировать данные в новую таблицу, такую-же, но с ключами и блекджеком. И тормозить лог обычных пользователей не будет сверх необходимого - писать то в старую таблицу не запрещается. и процесс строительства индексов на новой таблице менеджер согласится пережить. И менеджеров таких, вероятно, не очень много. 
Тут, конечно, надо думать с какой частотой "обновлять" данные в таблице анализа. Насколько менеджеру нужна realtime информация о том, что происходит на сайте? 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 5.10.2012, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Вам нужно искать решение которое  не будет тормозить всю систему
Все логи вставлять как INSERT DELAYED если будите использовать Mysql, Sqlite ( придется отключить системное легирование еще увеличит скороть работы вставки упдейта )

ksnk, написали выше отличный план реализации системы.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1501 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.