用户使用报告的星型模式设计
Star Schema Design for User Utilization Reports
场景:我为用户导出了 3 种利用率指标。在我的应用程序中,用户 activity 是通过他的登录历史记录、用户拨打的客户电话的次数、用户执行的状态更改次数来跟踪的。
所有这些信息都保存在我的应用程序数据库中的 3 个不同的 table 中,例如 UserLoginHistory、CallHistory、OrderStatusHistory。每个用户所做的所有操作都与日期时间信息一起存储在这 3 table 中。
现在我正在尝试创建一个报告数据库,它将帮助我生成用户的整体利用率。基本上,报告应该向我显示一段时间内的每个用户:
- 用户名
- 角色
- 登录次数
- 通话次数
- 状态更新次数
现在我正在设计我的事实 table。我应该如何为这种情况创建事实 table?我应该着手创建一个单一的事实 table,其中的行在粒度日期级别(在我的 DimDate table 级别)或 3 个不同的事实 table 中捕获所有这些详细信息并将它们关联起来?
我上面描述的 2 个选项没有说服力,我正在寻找更好的设计。谢谢。
根据经验,当您的报告使用具有相同粒度 (UserName, Role, Day/Hour/Minute
) 的不同 facts/metrics (Number of Logins Made, Number of Calls Made, Number of Status updates Made
) 时,您将它们放在同一个事实 table,以避免昂贵的连接。
由于很多原因,这并不总是可行,但我觉得你的情况有点不同。
您与用户 activity 有三个 table,您可能在其中存储有关登录、呼叫和状态更新的更多详细信息。您的报告需要的是 table,其中包含针对您需要的时间粒度聚合的指标和值。
假设您需要日级别的报告,您需要这样的 table:
Day UserID RoleID #Logins #Calls #StatusUpdate
20150101 1 1 1 5 3
20150101 2 1 4 15 8
如果明天业务需要按小时报告,您将需要:
DayHour UserID RoleID #Logins #Calls #StatusUpdate
20150101 10:00AM 1 1 1 2 1
20150101 11:00AM 1 1 0 3 2
20150101 09:00AM 2 1 2 10 4
20150101 10:00AM 2 1 2 5 4
那么日级别 table 就像第二个级别的聚合(按日)版本。 DayHour 属性是 Day one 的子属性。
如果您需要详细信息,请细化。
你也可以直接从分钟级别的摘要table开始,但我会和业务仔细核对要求,通常一个小时范围(或15分钟)就足够了。
然后,如果他们需要获得更详细的信息,您可以随时深入查询您的原始 tables。好处是,当您钻取到该级别时,您应该只有一小部分行可供查询(例如特定用户名只需几个小时)并且您的数据库应该能够处理它。
场景:我为用户导出了 3 种利用率指标。在我的应用程序中,用户 activity 是通过他的登录历史记录、用户拨打的客户电话的次数、用户执行的状态更改次数来跟踪的。
所有这些信息都保存在我的应用程序数据库中的 3 个不同的 table 中,例如 UserLoginHistory、CallHistory、OrderStatusHistory。每个用户所做的所有操作都与日期时间信息一起存储在这 3 table 中。
现在我正在尝试创建一个报告数据库,它将帮助我生成用户的整体利用率。基本上,报告应该向我显示一段时间内的每个用户:
- 用户名
- 角色
- 登录次数
- 通话次数
- 状态更新次数
现在我正在设计我的事实 table。我应该如何为这种情况创建事实 table?我应该着手创建一个单一的事实 table,其中的行在粒度日期级别(在我的 DimDate table 级别)或 3 个不同的事实 table 中捕获所有这些详细信息并将它们关联起来?
我上面描述的 2 个选项没有说服力,我正在寻找更好的设计。谢谢。
根据经验,当您的报告使用具有相同粒度 (UserName, Role, Day/Hour/Minute
) 的不同 facts/metrics (Number of Logins Made, Number of Calls Made, Number of Status updates Made
) 时,您将它们放在同一个事实 table,以避免昂贵的连接。
由于很多原因,这并不总是可行,但我觉得你的情况有点不同。
您与用户 activity 有三个 table,您可能在其中存储有关登录、呼叫和状态更新的更多详细信息。您的报告需要的是 table,其中包含针对您需要的时间粒度聚合的指标和值。
假设您需要日级别的报告,您需要这样的 table:
Day UserID RoleID #Logins #Calls #StatusUpdate
20150101 1 1 1 5 3
20150101 2 1 4 15 8
如果明天业务需要按小时报告,您将需要:
DayHour UserID RoleID #Logins #Calls #StatusUpdate
20150101 10:00AM 1 1 1 2 1
20150101 11:00AM 1 1 0 3 2
20150101 09:00AM 2 1 2 10 4
20150101 10:00AM 2 1 2 5 4
那么日级别 table 就像第二个级别的聚合(按日)版本。 DayHour 属性是 Day one 的子属性。
如果您需要详细信息,请细化。
你也可以直接从分钟级别的摘要table开始,但我会和业务仔细核对要求,通常一个小时范围(或15分钟)就足够了。
然后,如果他们需要获得更详细的信息,您可以随时深入查询您的原始 tables。好处是,当您钻取到该级别时,您应该只有一小部分行可供查询(例如特定用户名只需几个小时)并且您的数据库应该能够处理它。