Как хранить пользовательскую статистику в базе данных(mysql) для разных разделов?

Имеется однородный контент, например форум, новости, статьи и тд. Контент состоит из топика и комментариев к нему. Пользователь пишет топики и комментарии, нужно хранить статистику по каждому пользователю.

Первая мысль - создать обычную таблицу users_stat, с полями user_id, forum_thread_count, forum_message_count​​, news_thread_count, news_message_count и тд. И при создании нового топика на форуме или комментария делать UPDATE users_stat SET forum_thread_count = forum_thread_count + 1 WHERE user_id = current_user_id. Но проблема в том что могут добавляться новые разделы, тогда придётся делать alter table таблицы со статистикой а это не хорошо.
Была ещё такая идея. Создать таблицу users_stat с полями user_id, content (varchar 50), counter​​. И при создании нового топика на форуме или комментария делать UPDATE users_stat SET counter = counter + 1 WHERE user_id = current_user_id AND content = 'forum_thread'. Для случая первого топика, когда ещё нет записей в таблице users_stat для постера, сделать primary index по полям user_id и content и тогда сохранение статистики изменится INSERT INTO users_stat (user_id, content, counter) VALUES (current_user_id, 'forum_thread', 1) ON DUPLICATE KEY UPDATE counter = VALUES(counter + 1). Но получается что insert работает только один раз а дальше, при каждом сохранении, будет происходить анализ всей таблицы на поиск дубликатов. На больших объёмах тормоза обеспечены.

Может кто-нибудь подкинет ещё идейки?
  • Вопрос задан
  • 2981 просмотр
Пригласить эксперта
Ответы на вопрос 2
@kambur
Создать таблицу для статистики как во втором варианте и написать триггеры, которые сами будут ее обновлять.
Плюсы:
- не нужно будет писать дополнительный код на php;
- при добавлении новых таблиц, которые будут изменять статистику, просто добавляем для нее новый триггер.
Ответ написан
Комментировать
Создать сущность статистика с полями key и value и написать метод, инкрементирующий value у записи в сущности с переданным $key.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы