Я пытаюсь разработать способ создания графиков на основе временной шкалы для кампаний по электронной почте.Поскольку каждая кампания может содержать сотни тысяч сообщений, и в конечном итоге будут сотни или тысячи кампаний, я не могу предоставить графики в реальном времени, мне нужно каким-то образом предварительно обрабатывать журналы, чтобы графики могли быть сгенерированы в разумные сроки.(несколько секунд).
Вот упрощенная версия моей текущей идеи, которая работает хорошо, но имеет недостаток остановки показа:
CREATE TABLE message_log (
log_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
log_campaign_id INT UNSIGNED NOT NULL,
log_message_id INT UNSIGNED NOT NULL,
log_action VARCHAR(10) NOT NULL,
log_timestamp INT UNSIGNED NOT NULL,
log_counted TINYINT UNSIGNED NOT NULL DEFAULT 0,
INDEX(log_counted)
);
CREATE TABLE message_stats (
stats_campaign_id INT UNSIGNED NOT NULL,
stats_year INT UNSIGNED NOT NULL,
stats_month TINYINT UNSIGNED NOT NULL,
stats_day TINYINT UNSIGNED NOT NULL,
stats_hour TINYINT UNSIGNED NOT NULL,
stats_sent_count INT UNSIGNED NOT NULL,
stats_open_count INT UNSIGNED NOT NULL,
stats_bounce_count INT UNSIGNED NOT NULL,
PRIMARY KEY (stats_campaign_id, stats_year, stats_month, stats_day, stats_hour)
);
Так что идея заключается в различных log_action (отправлено, open, bounce) регистрируются в режиме реального времени в таблице message_log.Таблица message_stats содержит обработанные данные, которые являются просто подсчетом отправленных, открытых и отклоненных сообщений с интервалом в 1 час.Флаг message_log.log_counts указывает, была ли строка обработана в message_stats.
Когда мне нужна актуальная статистика, я просто выбираю строки из message_log с log_counts = 0, подсчитываю их в message_stats и устанавливаю log_counts =1.Теперь я могу быстро и легко выбирать статистику для конкретной или общей годовой, ежемесячной, ежедневной или почасовой статистики, группируя различные столбцы.
Может быть проще пропустить полностью message_log и просто обновить таблицу message_stats в реальном временивремя, но я решил сохранить необработанные данные журнала, чтобы впоследствии их можно было легко восстановить, просто обрезав message_stats и установив message_log.log_counts = 0.
Пока в тестировании это работает хорошо,но недостаток в том, что графики должны быть привязаны к конкретной локали, и поскольку временные шкалы уже обработаны на основе системного часового пояса, с помощью этой системы невозможно создать графики, специфичные для часового пояса.
Есть идеи по поводу лучшего подхода?Я знаю, что я не первый, кто сталкивается с этой дилеммой.