Я пытаюсь разработать способ генерации графиков на основе временной шкалы для кампаний по электронной почте. Поскольку каждая кампания может содержать сотни тысяч сообщений, и в конечном итоге будут сотни или тысячи кампаний, я не могу предоставлять графики в реальном времени, мне нужно как-то предварительно обработать журналы, чтобы графики могли быть сгенерированы в разумные сроки (несколько секунд).Лучший способ обработки и хранения данных аналитики
Вот упрощенная версия моей текущей идеи, которая работает хорошо, но есть шоу остановочного недостаток:
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 (пересылаются, открытая, подпрыгивать) регистрируется в режиме реального времени в таблице message_log. В таблице message_stats хранятся обработанные данные, которые представляют собой просто количество отправленных, открытых и возвращенных сообщений через 1 час. Флаг message_log.log_counted указывает, была ли строка обработана в message_stats.
Когда мне нужна обновленная статистика, я просто выбираю строки из message_log с log_counted = 0, подсчитываю их в message_stats и устанавливаю log_counted = 1. Теперь я могу быстро и легко выбирать кампанию или общую годовую, ежемесячную, ежедневную или почасовую статистику, группируя различные столбцы.
Возможно, проще всего пропустить файл message_log и просто обновить таблицу message_stats в реальном времени, но я решил сохранить необработанные данные журнала, чтобы данные могли быть легко восстановлены позднее, просто путем усечения message_stats и установка message_log.log_counted = 0.
До сих пор в тестировании это работает хорошо, но недостаток - это графики, которые должны быть специфичны для локали, и поскольку временные графики уже обработаны на основе системного часового пояса, нет способа генерировать специфические для часовой пояс графики с этой системой.
Любые идеи по лучшему подходу? Я знаю, что я не первый человек, столкнувшийся с этой дилеммой.
Спасибо Macy, что имеет смысл, но поддержка по крайней мере 24 временных задержек будет означать увеличение объема хранимых данных и время предварительной обработки по меньшей мере до 24. Я не думаю, что это вариант. – Rob
@Rob Вы уверены, что Роб? Фактор 24 действительно не так много в стране RDMS. –