Я пытаюсь выяснить, как лучше всего смоделировать схему для этой аналитической системы на основе событий, которую я пишу. Моя главная проблема заключается в том, чтобы писать это так, чтобы запросы были простыми и быстрыми. Я тоже буду использовать MySQL. Я рассмотрю некоторые из требований и представляю схему возможной (но я думаю, бедной) схемы.
Требования
-
Отслеживать события (например, появление треков в событии "APP_LAUNCH" )
-
Определение пользовательских событий
-
Возможность сегментировать события в > 1 пользовательских свойствах (например, получать вхождения "APP_LAUNCH", сегментированные по свойству "APP_VERSION" )
-
Трековые сеансы
-
Выполнять запросы, основанные на диапазоне временной шкалы
Возможное моделирование
Основная проблема, с которой я столкнулась, заключается в том, как моделировать сегментирование и запросы для выполнения, чтобы получить общее количество событий.
Моя первоначальная идея состояла в том, чтобы определить таблицу EVENTS с идентификатором, int count, timestamp, свойством (?) и внешним ключом EVENTTYPE. EVENTTYPE имеет идентификатор, имя и дополнительную информацию, относящуюся к родовому типу событий.
Например, событие "APP_LAUNCH" будет иметь запись в таблице СОБЫТИЙ с уникальным идентификатором, счетчиком, представляющим количество раз, когда произошло событие, метку времени (неуверенность в том, на что это делается печать), а также свойство или список свойств (например, "APP_VERSION", "COUNTRY" и т.д.) и внешний ключ для EVENTTYPE с именем "APP_LAUNCH".
Комментарии и вопросы
Я уверен, что это не очень хороший способ моделировать это по следующим причинам. Это затрудняет выполнение запросов timestamp ranged ( "Число APP_LAUNCHES между временем x и y" ). Таблица EVENTTYPE действительно не служит цели. Наконец, я не уверен, как бы я мог выполнять запросы для разных сегментов. Последний из тех, кого я больше всего беспокоюсь.
Я был бы признателен за любую помощь, помогающую правильно моделировать это или указывая на ресурсы, которые помогут.
Последний вопрос (который, вероятно, немой): Неправильно ли вставлять строку для каждого события? Например, скажем, моя клиентская библиотека выполняет следующий вызов моего API:
track("APP_LAUNCH", {count: 4, segmentation: {"APP_VERSION": 1.0}})
Как бы я действительно сохранил это в таблице (это, очевидно, тесно связано с дизайном схемы)? Неправильно ли просто вставлять строку для каждого из этих вызовов, из которых может быть значительная сумма? Моя реакция кишки состоит в том, что меня действительно интересуют главным образом общие агрегированные подсчеты. У меня недостаточно опыта работы с SQL, чтобы знать, как эти запросы выполняют, возможно, сотни тысяч этих записей. Будет ли сводная таблица или кеш в памяти помочь облегчить проблемы, когда я хочу, чтобы клиент фактически получал аналитику?
Я понимаю, что здесь много вопросов, но я бы очень признателен за любую помощь. Благодарю!