【问题标题】:How to replace primary key with surrogate keys during ETL?如何在 ETL 期间用代理键替换主键?
【发布时间】:2021-03-07 19:54:31
【问题描述】:

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

在 ETL 过程中用代理键替换主键在实践中的表现如何?就像工作流程一样 - 它只是分配新的身份吗?如果是这样,以前的值如何,如何用新创建的业务键替换现有的业务键?

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

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

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

【问题讨论】:

  • 澄清一下,你是说你有一个现有的 DW,出于某种原因,为了使用源系统中的 PK,你现在正试图正确地修复它,使用SK?您不是在问如何在您从头开始构建的 DW 中使用 SK?
  • 让我们考虑这两种情况。更具体地说,我对构建 DWH 和从头开始分配代理键的技术过程很感兴趣

标签: sql etl primary-key surrogate-key sql-data-warehouse


【解决方案1】:

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

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

  2. 使用这个标识符在目标维度中查找对应的记录——它包含这个标识符以及 SK 和其他属性——如果在 Dim 中找到记录,则返回 SK

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

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

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

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

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

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

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

【讨论】:

  • 谢谢。这非常有帮助。花了很多时间搜索如何从头开始实施数据仓库的实践练习,但没有找到任何东西。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多