|
|
|
| Есть некая база, хранящая ежедневную статистику по каждому пользователю (кол-во заходов). Изначально, скрипт сразу получает 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) в секунду. | |
|
|
|
|
|
|
|
для: 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
|
Проблемы аутентификации к этой задаче прямого отношения не имеют, и впутывать их сюда не надо. | |
|
|
|
|
|
|
|
для: Trianon
(14.02.2007 в 17:21)
| | Спасибо. Решение действительно умное. | |
|
|
|