问题描述
目前面临一个问题,我正在尝试为 Web 应用程序创建登录利用率报告。为了稍微描述一下报告,我们系统中的用户被标记有关于用户的不同元数据。例如,我可能会被标记为“纽约市”和“软件工程师”,而其他用户可能会被标记为不同的位置和职位。使用情况报告基本上如下:
- 时间段(每季度)
- 总登录次数
- 唯一登录
- 用户总数
- “参与百分比”(唯一登录次数/总用户数)
问题是,报告需要有点动态。我需要能够应用职位和地点的任意组合,并让每个数字都反映应用的元数据。时间段还需要能够轻松调整以支持每周、每月和每年。理想情况下,我可以在 Redshift 中创建一个视图,允许我们的 BI 软件用户在他们认为合适的时候运行此报告。
我的问题是,设计数据模型以支持此报告的理想策略是什么?我目前有一个原子事实表,其中包含具有此架构的所有登录名:
- 用户名
- 登录 ID
- 登录时间戳
- 职务组 ID(职务的 MD5 哈希值以支持多值)
- 位置组 ID(位置的 MD5 哈希值以支持多值)
事实表让我可以轻松地编写一个查询来汇总总数(登录 ID 的计数)和唯一性(不同的用户 ID 计数)。
如何补充必须包含用户总数的数据?我目前最好的方法是什么?
解决方法
属性之间的分层、固定深度的多对一 (M:1) 关系通常被非规范化或折叠成扁平化的维度表。如果您的职业生涯大部分时间都在为事务处理系统设计实体关系模型,那么您将需要抵制将 M:1 关系标准化或雪花化为更小的子维度的本能倾向;维度非规范化是维度建模中的游戏名称。
在单个维度表中表示多个 M:1 关系是比较常见的。一对一的关系,如与产品代码关联的唯一产品描述,也在维度表中处理。偶尔会在事实表中解决多对一的关系,例如详细维度表有数百万行并且其汇总属性经常变化的情况。但是,应谨慎使用事实表来解决 M:1 关系。
在您的情况下,我建议您使用以下设计作为解决方案:
