Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: MySQL или файлы (варианты с запросами INSERT и UPDATE)
 
 автор: Reша   (14.02.2007 в 16:56)   письмо автору
 
 

Есть некая база, хранящая ежедневную статистику по каждому пользователю (кол-во заходов). Изначально, скрипт сразу получает id пользователя (id_user).

Структура таблиц следующая:

Таблица users:
id_user
login
password

Таблица log:
id_user
count
log_date

Проблема такая - при вставлении данных в таблицу log необходимо проверять наличие id_user в таблице users (чтобы статистика забаненных юзеров более не велась статистика и не велась статистика несуществующих пользователей). Плюс к этому, нам нужно проверить, создан ли уже лог пользователя на текущую дату (например, в 00:05 лога на текущий день ещё может не вестись).

Получаем запрос:

SELECT MAX(log.log_date) FROM log, users
WHERE log.id_user = users.id_user


Если строки получены, то пользователь в базе есть.

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

Если дата равна сегодняшней -> UPDATE,
иначе, -> INSERT

Вот такой вот запарненький вариант. При 100к+ посетителей в день данный вариант становится просто неприемлем.



Мой вопрос:
Не проще ли сделать всё на файлах, где будет в папке юзера храниться файлы, содержащие количество посещений. Один файл на каждый день.
Тогда получаем довольно простой механизм:
Проверяем наличие папки с именем id_user, там проверяем наличие файла $today.txt, если нет, открываем для записи и вставляем "1", иначе, считываем содержимое файла, прибавляем к нему единичку, вставляем обратно в файл.

Или всё-таки есть более адекватное решение моей проблемы?


P.S. Необходимо учитывать, что количество посещений может быть до 5-6 (а то и 10) в секунду.

   
 
 автор: Trianon   (14.02.2007 в 17:21)   письмо автору
 
   для: Reша   (14.02.2007 в 16:56)
 

Я бы вынес статистику прошедших дней в отдельную таблицу.
Тогда обращение к текущей делалось бы по ключу id_user
А перенос из таблицы в таблицу выполнял бы раз в сутки.
Накопление производилось бы запросом

$res = mysql_query("UPDATE current SET cnt=cnt+1 WHERE id_user = $current_user_id");
if(mysql_affected_rows() == 0)
    $res = mysql_query("INSERT INTO current (id_user)  VALUES($current_user_id)");


А перенос - запросом

INSERT INTO log(id_user, cnt, logdate) SELECT id_user, cnt, '$prev_date' FROM current


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

   
 
 автор: Reша   (14.02.2007 в 17:56)   письмо автору
 
   для: Trianon   (14.02.2007 в 17:21)
 

Спасибо. Решение действительно умное.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования