如何在 ETL 期间用代理键替换主键?
How to replace primary key with surrogate keys during ETL?
有一个困扰我一段时间的问题。
在 ETL 过程中用代理键替换主键在实践中看起来如何?比如工作流程是什么——它只是分配新的 IDENTITY 吗?如果是这样,以前的值如何,如何用新创建的业务密钥替换现有的业务密钥?
在我看来,具体的工作流程如下所示,但我还没有实践过:
- 删除 DimProduct 和 FactSales 表中现有的 PK_Product 和 FK_Product。
- 将新的 IDENTITY 列设置为 dimProduct。
- 将新列添加到 FactSales,其值来自基于先前业务键的连接的新创建的 IDENTITY 列。
- 删除两个表中的旧 ProductKey 列。
- 为新创建的代理 IDENTITY 键添加约束。
- 在表之间分配未来值的引用。
但请告诉我你在工作中是如何做到这一点的并纠正我,因为我认为我错了。
让我们以最简单的情况为例,您的目标维度是从单个源系统加载的。基本步骤是:
获取源系统记录的唯一标识符 - 通常是 PK 或 BK
使用此标识符在目标维度中查找相应的记录 - 它包含此标识符以及 SK 和其他属性 - 如果在中找到记录,则 return SK昏暗
如果找到 SK,那么您将使用 SK 作为主要标识符对 Dim 执行更新
一个。您可能还需要执行插入,例如如果 Dim 是 SCD2
b。如果源记录和目标记录之间没有变化,您可以决定不处理源记录
如果没有找到 SK 那么您将在目标 Dim 中插入一条新记录,以两种主要方式之一生成新的 SK 值:
一个。使用底层数据库的能力,如序列、自增列等
b。使用 ETL 工具的功能,例如序列生成器
这些显然是您需要遵循的逻辑步骤。您实际如何实施它们完全取决于您的 ETL/ELT 组件 - 因此 运行 数据库中的合并命令看起来与 Informatica 工作流有很大不同,但“在幕后”这两个过程都遵循相同的逻辑步骤
有一个困扰我一段时间的问题。
在 ETL 过程中用代理键替换主键在实践中看起来如何?比如工作流程是什么——它只是分配新的 IDENTITY 吗?如果是这样,以前的值如何,如何用新创建的业务密钥替换现有的业务密钥?
在我看来,具体的工作流程如下所示,但我还没有实践过:
- 删除 DimProduct 和 FactSales 表中现有的 PK_Product 和 FK_Product。
- 将新的 IDENTITY 列设置为 dimProduct。
- 将新列添加到 FactSales,其值来自基于先前业务键的连接的新创建的 IDENTITY 列。
- 删除两个表中的旧 ProductKey 列。
- 为新创建的代理 IDENTITY 键添加约束。
- 在表之间分配未来值的引用。
但请告诉我你在工作中是如何做到这一点的并纠正我,因为我认为我错了。
让我们以最简单的情况为例,您的目标维度是从单个源系统加载的。基本步骤是:
获取源系统记录的唯一标识符 - 通常是 PK 或 BK
使用此标识符在目标维度中查找相应的记录 - 它包含此标识符以及 SK 和其他属性 - 如果在中找到记录,则 return SK昏暗
如果找到 SK,那么您将使用 SK 作为主要标识符对 Dim 执行更新
一个。您可能还需要执行插入,例如如果 Dim 是 SCD2
b。如果源记录和目标记录之间没有变化,您可以决定不处理源记录
如果没有找到 SK 那么您将在目标 Dim 中插入一条新记录,以两种主要方式之一生成新的 SK 值:
一个。使用底层数据库的能力,如序列、自增列等
b。使用 ETL 工具的功能,例如序列生成器
这些显然是您需要遵循的逻辑步骤。您实际如何实施它们完全取决于您的 ETL/ELT 组件 - 因此 运行 数据库中的合并命令看起来与 Informatica 工作流有很大不同,但“在幕后”这两个过程都遵循相同的逻辑步骤