我最近在事实表上遇到了“有效自”和“有效至”列。显然,这对于维度来说很常见,但我之前没有在事实表上看到它们,也找不到任何表明它们被广泛使用的信息。
表粒度与银行账户交易类似,因此在进行存款或提取金额时会生成一个新事实。包含这些列的原因是需要一致的报告(如果我们今天运行此报告,它必须与一周前相同)以及源系统/数据质量差;用户可以进入源系统并说“这笔押金实际上只有 10 英镑,而不是 100 英镑”。发生这种情况时,会插入第二个事实行并且原始行已过期。
在我看来,应该插入一个新的事实行来反转原始数据,以维护历史记录(在示例中应用 -100 英镑),并且应该插入更新的事实(+10 英镑)。感觉就像使用有效的 to/from 列在报告时给用户带来了太多的复杂性以及错误的风险(总结了活动和过期的事实)。
有没有人有这方面的经验,是否有任何专门涵盖它的参考资料(博客文章、文章甚至书籍)?
有效性取决于用户希望如何查看数据。您只是将其视为交易事实。其他类型的事实表包括定期快照和累积快照。如果您想查看有人更正一行以帮助减少错误条目的所有时间,则有效日期可能是适当的,因此很明显交易已更新。这将创建一个有点类似于类型 2 SCD 的事实表。
Kimball Group 有一篇文章直接解决了您的问题。
这是 Kimball Group 的设计技巧,其中讨论了有效的日期累积 snpashot 事实表。
您可能是正确的,您应该只添加反转原始行的事务。如果您只需要查看交易并总结它们,这听起来可能是一个有效的解决方案。这就是我看到的大多数会计数据的工作方式。Kimball 说,有效日期事实表可能有助于快速计算特定时间点的账户余额,尤其是跟踪缓慢变化的余额。但这是一个相当罕见的情况。我认为您担心它会令用户感到困惑也是有道理的。您必须决定是否可以通过教育来克服这一点,以及是否值得在数据中增加分析能力。
在我的数据仓库经验中,我不必做这么多,因为我的大部分事实都是简单的事务或定期快照。但是我已经为多对多关系创建了几个有效的过时桥接表。
粒度是“交易”还是“当前余额”。根据您的描述,这似乎是两者的混合。如果粒度是“交易”,那么您应该计算余额并更正错误输入的任何“交易”。如果粒度是“当前余额”,那么您必须处理更正错误和基于事务更新值之间的差异。