我试图找出为我正在编写的这个基于事件的分析系统的模式建模的最佳方法。我主要关心的是以一种使查询简单快速的方式编写此代码。我也将使用 MySQL。我将介绍一些要求并概述可能的(但我认为很糟糕)架构。
要求
跟踪事件(例如跟踪“APP_LAUNCH”事件的发生)
定义自定义事件
能够在 >1 个自定义属性上分割事件(例如,在“APP_VERSION”属性上分割“APP_LAUNCH”的出现)
跟踪会话
根据时间戳范围执行查询
可能的建模
我遇到的主要问题是如何对分段和查询进行建模以获取事件的总计数。
我最初的想法是定义一个 EVENTS 表,其中包含 id、int 计数、时间戳、属性 (?) 和 EVENTTYPE 的外键。EVENTTYPE 具有属于通用事件类型的 id、名称和附加信息。
例如,“APP_LAUNCH”事件将在 EVENTS 表中有一个条目,该条目具有唯一 id、表示事件发生次数的计数、时间戳(不确定标记在什么上面)以及属性或属性列表(例如“APP_VERSION”、“COUNTRY”等)和名称为“APP_LAUNCH”的 EVENTTYPE 的外键。
评论和问题
我很确定这不是一个很好的建模方法,原因如下。这使得很难进行时间戳范围查询(“时间 x 和 y 之间的 APP_LAUNCES 数”)。EVENTTYPE 表并没有真正发挥作用。最后,我不确定如何针对不同的分段执行查询。最后一个是我最担心的。
我将不胜感激帮助正确建模此模型或向我指出有用的资源。
最后一个问题(这可能很愚蠢):为每个事件插入一行是不是很糟糕?例如,假设我的客户端库对我的 API 进行了以下调用:
track("APP_LAUNCH", {count: 4, segmentation: {"APP_VERSION": 1.0}})
我将如何将其实际存储在表中(这显然与模式设计密切相关)?为这些调用中的每一个简单地插入一行是否很糟糕,其中可能有很多?我的直觉反应是,我真正感兴趣的主要是总体总数。我没有足够的 SQL 经验来了解这些查询如何在可能数十万个这些条目中执行。当我希望客户端实际获得分析时,聚合表或内存缓存是否有助于缓解问题?
我意识到这里有很多问题,但我非常感谢任何和所有的帮助。谢谢!