我在一组Office
,Employee
,Location
表上执行ETL,遵循将所有数据引入临时表的标准做法,首先通过提取包,然后在每个临时表上执行转换加载,以将数据放入相应的表中。
在我的每个转换加载 SSIS包中,我使用{{1执行 CUD (创建,更新,删除) }和MERGE JOIN
拆分。
当Staging表中的数据与相应的真实表一起 1对1 时,此方法可以正常工作。在下面的场景中(见图),CONDITIONAL
表与SampleLocation
表一对一。
我遇到的麻烦是决定如何处理Staging表中有数据进入外键表的情况。
如果您查看以下数据库图表......
来自StageSampleLocation
的数据会转到StageSampleOffice
,用于包含Office数据的字段。除办公室数据外,SampleOffice
还有人员数据 - 在此示例中,需要在FK表StageSampleOffice
中查找OfficeManagerName
字段。如果SamplePerson
表中不存在该名称,则需要首先在SamplePerson
中插入此名称,并检索该人员的SamplePerson
PK值并将其存储为FK我的数据流任务中PersonId
表中导入的Office行的值。
同样,对于SampleOffice
中的地址信息,需要在StageSampleOffice
FK表中查找详细信息,如果地址不存在,则需要插入新地址使用SampleLocation
中的相应值。完成后,地址的StageSampleOffice
将作为FK存储在LocationId
表中。
如您所见,SampleOffice
和SampleLocation
的数据可能会从2个或更多来源进入系统。在上面的示例中,对于SamplePerson
,我得到一个只有地址的位置数据文件。我还从SampleLocation
表格中获取来自各种办公类型的Office记录的一部分地址。
我已将 Extract 工作流与Transform-Load工作流分开。我在每个临时表中有1个解压缩包,它基本上从源(flatfile或表)读取数据,截断登台表,并将所有内容按原样导入到临时表中。
我在想
StageSampleOffice
中存在的Person数据,我将首先将数据插入StageSampleOffice
表(图中未显示),然后执行 Transform-Load StageSamplePerson
的包,用于为这些人创建或更新SamplePerson
中存在的位置数据,我将首先将数据插入StageSampleOffice
表(图中未显示),然后执行 Transform-Load StageSampleLocation
的包,用于创建或更新这些位置。这样,当流返回到执行SampleLocation
表的Transform-Load的主包时,所有FK行都将出现在相应的表中。
这是一个好主意,还是有更好的方法。
谢谢!
答案 0 :(得分:1)
对我来说,似乎是“六分之一,六分之一”。
无论哪种方式,您最终都会检查每个人和每个位置,看看它是否已经在最终目的地表中并进行插入。
您是否在临时表中“预压缩”它们,或者工作负载是否相同。我会采用对您来说更直观的方法,因为这将是您将来发现更易于维护的方法。