捕捉维度层次结构中级别之间变化的最简洁的方法是什么?
我有维度层次结构 [Area] > [Region] > [Location],其中 Area 是 Region 的父级,Region 是 Location 的父级。位置是层次结构的最低级别,并与事实表相关联。
业务规则是: 位置能够根据业务需要更改分配到的区域。此外,区域能够更改它们分配到的区域。
我们希望捕获这些变化,以便在进行历史分析时,我们可以比较位置更改其区域之前和之后的业务指标,以及区域更改其区域之前和之后的业务指标。
做这个的最好方式是什么?
我提出的四种方法似乎都有很大的缺点:
- 在层次结构级别之间使用桥接表需要您使用时间界限(有效的开始/结束日期)在您向上走层次结构时正确识别孩子属于哪个父级。这使得查询容易出错,尤其是对于具有多个级别的层次结构。
- 每当子记录与父记录的关系发生变化时,对子记录进行版本控制(例如,当区域 A 从区域 A 移动到区域 B 时对区域 A 进行版本控制),然后将更改一直沿层次向下级联(例如,创建与区域 A 相关联的位置的新版本以便它们与新的区域 A) 相关联。
- 更新子记录对父记录的引用,使您使用时间限制来重新组装正确的历史记录(容易出错)。
- 在向上查询层次结构时始终使用时间界限,以确保在分析事实时位置 A 与正确的区域相关联(同样,区域 A 与正确的区域相关联)。
这些对我来说似乎都不干净。
有没有更好的办法?
非常感谢
如果要捕获三个表的历史变化,则需要通过添加一个和(在三个表中)将层次结构表(即
[Area]
,[Region]
)更改为维度表的子维度(即),并且您可以跟踪维度和子的变化- 维度属性,以便使用渐变维度 (SCD)技术报告历史数据。[Location]
effective_date
expire_date
我强烈推荐桥接表的第一个选项。如果您确保捕获所有三个表上的历史变化就可以正常工作,尽管我同意您的观点,即 JOIN'ing 是一个问题。只需确保(在 JOIN 子句中) DateInserted 和 ValidTill 与事实表中的匹配即可。更多关于这里的桥牌桌 - 金博尔大学
或者:在事实表中保留对所有三个维度(区域、区域、位置)的引用。因为无论如何您都需要在事实表上有一个 DATE,您可以轻松地映射更改,并且因为 - 正如您所说 - 位置可能是 A 用于一个事务,但 B 用于不同的事务,您最好采用这种方式进行 GROUPing通过并看到趋势和变化。不利的一面:它会使事实表变得更胖。
如果您正在使用 SSAS(或打算将其用于数据建模),我建议您阅读非常好的阅读多对多革命,它解释了如何向最终用户实施它。