如何在 ETL 期间用代理键替换主键?

How to replace primary key with surrogate keys during ETL?

有一个困扰我一段时间的问题。

在 ETL 过程中用代理键替换主键在实践中看起来如何?比如工作流程是什么——它只是分配新的 IDENTITY 吗?如果是这样,以前的值如何,如何用新创建的业务密钥替换现有的业务密钥?

在我看来,具体的工作流程如下所示,但我还没有实践过:

  1. 删除 DimProduct 和 FactSales 表中现有的 PK_Product 和 FK_Product。
  2. 将新的 IDENTITY 列设置为 dimProduct。
  3. 将新列添加到 FactSales,其值来自基于先前业务键的连接的新创建的 IDENTITY 列。
  4. 删除两个表中的旧 ProductKey 列。
  5. 为新创建的代理 IDENTITY 键添加约束。
  6. 在表之间分配未来值的引用。

但请告诉我你在工作中是如何做到这一点的并纠正我,因为我认为我错了。

让我们以最简单的情况为例,您的目标维度是从单个源系统加载的。基本步骤是:

  1. 获取源系统记录的唯一标识符 - 通常是 PK 或 BK

  2. 使用此标识符在目标维度中查找相应的记录 - 它包含此标识符以及 SK 和其他属性 - 如果在中找到记录,则 return SK昏暗

  3. 如果找到 SK,那么您将使用 SK 作为主要标识符对 Dim 执行更新

    一个。您可能还需要执行插入,例如如果 Dim 是 SCD2

    b。如果源记录和目标记录之间没有变化,您可以决定不处理源记录

  4. 如果没有找到 SK 那么您将在目标 Dim 中插入一条新记录,以两种主要方式之一生成新的 SK 值:

    一个。使用底层数据库的能力,如序列、自增列等

    b。使用 ETL 工具的功能,例如序列生成器

这些显然是您需要遵循的逻辑步骤。您实际如何实施它们完全取决于您的 ETL/ELT 组件 - 因此 运行 数据库中的合并命令看起来与 Informatica 工作流有很大不同,但“在幕后”这两个过程都遵循相同的逻辑步骤