Я пытаюсь найти лучший способ моделирования схемы для этой аналитической системы на основе событий, которую я пишу. Моя главная проблема заключается в том, чтобы писать это так, чтобы запросы были простыми и быстрыми. Я тоже буду использовать MySQL. Я рассмотрю некоторые из требований и представляю схему возможной (но я думаю, бедной) схемы.Проектирование схемы базы данных для аналитики на основе событий
Требования
Отслеживание событий (например, дорожки вхождения "APP_LAUNCH" событие)
Определение пользовательских событий
Возможность сегментировать события на> 1 пользовательских свойств (например, прибудет вхождения «APP_LAUNCH», сегментированные по свойству «APP_VERSION»)
Трек-сеансы
Выполнение запросов на основе диапазона временных меток
Возможное моделирование
Основная проблема, которую я имею, как модель сегментации и запросов, чтобы выполнить, чтобы получить общие подсчеты события ,
Моя первоначальная идея состояла в том, чтобы определить таблицу СОБЫТИЙ с идентификатором, 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, чтобы знать, как эти запросы выполняют, возможно, сотни тысяч этих записей. Будет ли сводная таблица или кеш в памяти помочь облегчить проблемы, когда я хочу, чтобы клиент фактически получал аналитику?
Я понимаю, что здесь много вопросов, но я бы очень признателен за любую помощь. Благодаря!
Это фантастический ответ, но у меня есть вопрос. Я немного неясен в отношении вашей точки в № 3. Если EVENTTYPE_ID (имя события) уже существует в таблице СОБЫТИЯ, как возникает последовательность из наличия внешнего ключа в таблице EVENTTYPE? – CCSab
@CCSab, потому что, используя внешний ключ, вы можете обеспечить проверку целостности внутренней базы данных - чтобы можно было ввести только те EVENTTYPE_ID, которые находятся в таблице EVENTTYPE! См. [Ограничения внешнего ключа в руководстве] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) – TMS
О, это делает тонну смысла! Спасибо за фантастический ответ! Я принял его и наградил наградой :) – CCSab