我正在开发一个新的数据仓库,我的员工维度的源表每天都会被截断,并重新加载所有历史记录和更新、删除和新插入。
跟踪这些更改的列是生效日期和生效顺序。我们还有一个审计表,通过比较今天和前一天的表,帮助我们确定每天更新、插入和删除的记录。
我的问题是如何在暂存层中的表上进行增量加载,以便作为标识列的代理键保持不变。如果我对最终维度进行截断,那么每次截断时都会得到新的代理键因此它弄乱了我的事实表。
我正在开发一个新的数据仓库,我的员工维度的源表每天都会被截断,并重新加载所有历史记录和更新、删除和新插入。
跟踪这些更改的列是生效日期和生效顺序。我们还有一个审计表,通过比较今天和前一天的表,帮助我们确定每天更新、插入和删除的记录。
我的问题是如何在暂存层中的表上进行增量加载,以便作为标识列的代理键保持不变。如果我对最终维度进行截断,那么每次截断时都会得到新的代理键因此它弄乱了我的事实表。
截断维度绝不是一个好主意。您将失去跟踪将由事实表引用的主键的能力。
如果您必须每天截断维度,那么您不应该有自动增量键。相反,您应该将维度的先前状态与新状态进行比较,并查找键值以便保留它们。
示例:您的昏暗有 2 个条目,员工 A 和员工 B,键分别为 1 和 2。第二天,员工 A 更新为 AA,并添加了员工 C。您应该可以将这个新数据集与旧数据集进行比较,这样 AA 仍然有 key 1,B 保留在 key 2 中,C 保留在 key 3 中。当然,您不能依赖自增键,并且必须从以前的位置设置它们
此外,请注意删除:仅仅因为删除了员工并不意味着与该员工有关的事实也消失了。不要从事实表中删除记录,而是添加一个“已删除”标志并将其设置为 Y 以表示已删除的记录。在您的报告中,过滤掉那些已删除的员工,因此您只报告未删除的员工。
但是,最好的方案始终是不截断表,而是在维度中执行必要的更新,保留主键(应该是合成的,无论如何都不是来自源系统)和任何没有改变的属性,将源系统中已删除的标记为已删除,并相应更新版本号、有效日期等。
您的问题似乎与 Kimball 所描述的 II 型缓慢变化维度非常接近,您的 ETL 应该能够处理该问题。
只要您拥有唯一标识一名员工的业务密钥,源上的表截断就不会代表真正的问题。如果是这样,满足您的要求的最佳方法是将您的员工维度作为类型 2 SCD 处理。
通常,ETL 软件提供组件来管理 SCD。然而,处理 SCD 的一种方法可能在于根据您要跟踪的属性定义散列。然后,如果对于给定的业务键,您注意到在源上计算的新哈希与您存储在维度中的哈希不同,您将更新该记录的所有属性。
希望这可以帮助。