繁体   English   中英

SSIS ETL转换负载如何处理外键表数据的创建/更新(即UPSERT)?

[英]SSIS ETL Transform-Load How To Handle Create / Update (i.e. UPSERT) for Foreign Key Table Data?

我将按照以下标准惯例在一组OfficeEmployeeLocation表上执行ETL:首先通过Extract包将所有数据放入Staging表中,然后对每个staging表执行Transform-Load以获取数据放入相应的表中。

在我的每个Transform-Load SSIS程序包中,我正在使用MERGE JOINCONDITIONAL拆分来执行CUD创建,更新,删除 )。

当暂存表中的数据与对应的实际表为1对1时,这可以很好地工作。 在下面的场景中(参见图片), SampleLocation表与SampleLocation表是StageSampleLocation

我遇到的麻烦是决定如何处理暂存表中包含将要进入外键表的数据的情况。

问题解释

如果您看下面的数据库图...

在此处输入图片说明

来自StageSampleOffice的数据进入具有Office数据的字段的SampleOffice中。 除了办公室数据之外, StageSampleOffice还具有Person数据-在此示例中,将需要在FK表SamplePerson查找OfficeManagerName字段。 如果该名称在SamplePerson表中不存在,则需要首先将该名称插入SamplePerson ,并且该人的PersonId PK值将被检索并作为FK值存储在SampleOffice表中导入的Office的SampleOffice中,在我的数据流任务中。

同样,对于StageSampleOffice的地址信息,需要在SampleLocation FK表中查找详细信息,如果该地址不存在,则需要插入一个新地址,并带有StageSampleOffice的相应值。 完成后,该地址的LocationId将作为FK存储在SampleOffice表中。

如您所见, SampleLocationSamplePerson数据可能会从2个或更多来源进入系统。 在上面的示例中,对于SampleLocation我得到一个仅具有地址的Location数据文件。 我还从StageSampleOffice表中获得了来自各种办公类型的Office记录的地址,作为Office记录的一部分。

到目前为止我尝试过的

我已经将“ 提取”工作流与“转换-加载”工作流分开了。 我每个登台表都有1个提取包,该包实际上从源(平面文件或表)中读取数据,截断登台表,并将所有内容按原样导入到登台表中。

我在想

  • 对于StageSampleOffice存在的Person数据,我首先将数据插入StageSamplePerson表(图中未显示),然后执行SamplePersonTransform-Load程序包,该程序将为这些Persons创建或更新
  • 对于StageSampleOffice存在的位置数据,我将首先将数据插入StageSampleLocation表(图中未显示),然后对SampleLocation执行Transform-Load程序包,该程序将为这些Location进行创建或更新。

这样,当流程返回到对SampleOffice表执行Transform-Load的主程序包时,所有FK行都将出现在相应的表中。

这是一个好主意,还是有更好的方法。

谢谢!

在我看来就像“一个,六个,另一个的六个”。

无论哪种方式,您最终都要检查每个人和每个位置,以查看它是否已在最终目标表中,并进行插入。

无论您是否将它们“预压缩”在登台表中,工作负载都将是相同的。 我会采用对您来说似乎更直观的方法,因为这将是您将来会发现更易于维护的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM