Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在ETL期间用代理密钥替换主键?_Sql_Etl_Primary Key_Surrogate Key_Sql Data Warehouse - Fatal编程技术网

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

Sql 如何在ETL期间用代理密钥替换主键?,sql,etl,primary-key,surrogate-key,sql-data-warehouse,Sql,Etl,Primary Key,Surrogate Key,Sql Data Warehouse,有一个问题一直困扰着我 在ETL过程中,用代理键替换主键的实际效果如何?就像什么是工作流-它只是分配新的身份吗?如果是,那么以前的值如何,如何用新创建的业务键替换现有的业务键 在我看来,一个特定的工作流如下所示,但我还没有在实践中这样做: 在DimProduct和FactSales表中删除现有PK_产品和FK_产品 将新标识列设置为dimProduct 将新列添加到FactSales,其值来自基于上一个业务密钥上的联接的新创建的标识列 在两个表中删除旧的ProductKey列 为新创建的代理标识

有一个问题一直困扰着我

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

在我看来,一个特定的工作流如下所示,但我还没有在实践中这样做:

  • 在DimProduct和FactSales表中删除现有PK_产品和FK_产品
  • 将新标识列设置为dimProduct
  • 将新列添加到FactSales,其值来自基于上一个业务密钥上的联接的新创建的标识列
  • 在两个表中删除旧的ProductKey列
  • 为新创建的代理标识键添加约束
  • 为将来的值在表之间分配引用

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

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

  • 获取源系统记录的唯一标识符-通常为PK或BK

  • 使用此标识符查找目标维度中的相应记录(其中包含此标识符以及SK和其他属性),如果在Dim中找到记录,则返回SK

  • 如果找到SK,则您将使用SK作为主要标识符对Dim执行更新

    a。如果仪表板集成模块(Dim)为SCD2,则可能还需要执行插入操作

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

  • 如果未找到SK,则您将在目标Dim中插入一条新记录,通过以下两种主要方式之一生成一个新的SK值:

    a。使用底层数据库的功能,如序列、自动增量列等

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


  • 这些显然是您需要遵循的逻辑步骤。实际上如何实现它们完全取决于您的ETL/ELT组件,因此在数据库中运行合并命令看起来与Informatica工作流非常不同,但“隐藏”这两个过程遵循相同的逻辑步骤,只是为了澄清一下,您是说您有一个基于某种原因而构建的现有DW吗,要从源系统使用PKs,并且您现在正在尝试将其修复为正确使用SKs?你不是在问如何在你正在从头开始建造的DW中使用SKS?让我们考虑一下这两种情况。更具体地说,我感兴趣的是构建DWH和从scratchThank分配代理密钥的技术过程。这非常有帮助。花了这么多时间在搜索如何从头实现数据仓库的实践练习上,但什么都没有找到。