不同粒度事实表的处理与跨表分析
1. 不同粒度事实的问题
当两个或多个事实描述具有不同粒度的事件时,它们代表不同的业务流程。例如,销售部门可能有以下业务需求:
- 按日期、客户和产品分析订购数量。
- 按日期、客户、产品和托运人分析发货数量。
这里发货数量多了一个维度细节——托运人,这一信息仅适用于发货,不适用于订单。
1.1 单事实表的困境
尝试使用单个事实表(如 sales_facts )来满足这些需求会带来诸多问题。该事实表的粒度要求按天、产品、客户以及可选的托运人记录订单、发货或两者。这种表述中“或”的存在就预示着问题的出现。
为了处理有订单但无发货的情况,设计中会在托运人维度添加一个特殊行,其代理键值为 0。当用户分析单个流程(如发货)时,报告中会出现大量值为 0 的行,还包含隐晦的托运人名称“[ not a shipper ]”,这会让业务用户感到困惑。而且,当订单和发货在同一天针对同一产品和客户发生时,需要存储两行数据,一行对应订单(无托运人数据),另一行对应发货(无订单数据),订单和发货永远不会记录在同一行。
另一种单事实表设计允许无托运人的事实表行使用 NULL 键,但这会进一步加剧报告难题。当托运人表参与查询时,多余的行可能会消失,但当托运人表不参与查询时,零值事实又会出现。此外,允许 shipper_key 为 NULL 值在同时研究订单和发货时需要不同的连接配置,难以限定特定的托运人类型。
1.2 多事实表的优势
当两个事实具有不同粒度时,将它们放在不同的事实表中可以避免
超级会员免费看
订阅专栏 解锁全文
285

被折叠的 条评论
为什么被折叠?



