统一星型模式中所谓的“风扇陷阱”(fan trap)是指两张表进行左连接时,副表中度量数据的发散现象,如果副表度量字段发散了且被用于聚合计算,那么很可能会得到错误的数据结果。下面以 Shipments 和 Sales 两个表为例进行演示:
按 Kimball 维度建模中的概念,Shipments 和 Sales 这两张表一般都被视作是事实表,不过在 USS 这里无需区分,只需要关心一张表有没有主键(没有主键的话,构建桥接表时需要额外创建技术主键)。
假如有两个分析需求:①从产品维度(ProductID)查看已下单产品的发货情况;②从订单维度(SalesID)查看发货的延迟(发货日期-订单日期)情况。由于这两个需求都需要从 Sales 表中取度量数据(SalesQuantity和SalesDate),而这两张表直接进行关联会使度量数据发散:
说明:图中左边的 Shipments 表漏了 ProductID 字段,请假设它存在,该示例需要用到
传统的一种正确做法是先对两张表分别按分析维度(ProductID或SalesID)聚合,然后再将聚合后的结果表进行关联,这样就避免了发散的问题,可以得到正确的结果。不过由于两次分析的维度不一样,两次的聚合粒度不一样,因而需要分别处理,两个需求两次不同的处理。
USS 的解决方案
统一星型模式(USS)通过桥接表和具备关联(association)功能的BI工具的组合能够完美地解决以上需求,不仅杜绝了上述的“风扇陷阱”还极易使用。
如果当前的BI工具并没有关联的功能,而只有传统的连接(join)功能,那么通过对桥接表做简单的调整也能达到同样的效果。简单的做法就是把有发散可能的度量字段随该表的主键都转移到桥接表上,示例如下:
本质上相同的另两种做法是:①把所有表的度量字段(不管是否会发散)一律都转移到桥接表中;②将存在度量字段发散可能的那些表拆分成两张表,一张只有非度量字段,一张只有度量字段。
以上做法都能达到同样的效果,可按企业实际情况或偏好选择。另外值得一提的是,如果不做任何调整,而直接将上面的原始表按连接的方式进行合并,实际上借助BI工具中的过滤公式也是可以得到正确数据结果的,只不过要求分析人员具备这种能力,因此一般是不建议的。