我正在使用Talend来填充数据仓库。我的工作是将客户数据写入维度表,将事务数据写入事实表。事实表上的代理键(p_key)是自动递增的。当我插入新客户时,我需要我的事实表来反映相关客户的ID。
正如我所提到的,我的p_key是auto auto_incrementing所以我不能只为p_key插入任意值。
有关如何在我的维度表中插入行并仍然检索要在我的事实记录中引用的主键的任何想法?
更多信息:
如果传入的数据未规范化怎么办?例如,我有一个包含以下数据的csv:
order # date total customer# first_name last_name
111 1/2/2010 500 101 John Smith
222 1/3/2010 600 101 John Smith
显然,我希望客户信息出现在维度表中,以及事实表中的交易数据:
dimension
101 john smith
fact
111 1/3/2010
222 1/3/2010
正如您所提到的,维度表的键将是自动递增。事实表需要引用此键。如何设计etl作业,以便在插入到?
后返回代理键此外,如果客户数据被扣除(如上所述),您如何处理密钥?
答案 0 :(得分:4)
我可能误解了你的问题,但是:
事实表可能有也可能没有自动递增PK,通常事实表中的PK是引用维度表的几个FK的组合。
维度表应具有自动递增PK。
在交易事实到达DW(或至少是事实表)之前,新客户应“登陆”客户维度表。
维度表应具有唯一标识客户的BusinessKey,如电子邮件,全名+图钉或类似名称。
传入的交易行也应该包含客户的BusinessKey字段 - 这就是我们识别客户的方式。
在将事务插入事实表之前,使用BusinessKey从客户维度表中查找客户PrimaryKey。
修改
如果您的新客户数据与交易捆绑在一起,请找到一种方法来提取客户数据并在交易之前将其路由到DW。
更新:
首先加载dimCustomer,决定使用BusinessKey - 所以维度应如下所示:
CustomerKey = 12345 (auto-incremented)
CustomerBusinessKey = john_smith_101 (must uniquely identify the John Smith)
CustomerFirstName = John
CustomerLastName = Smith
在维度加载过程中,您必须将传入的行分为两个流,即现有客户和新客户。来自“现有客户”流的行更新昏暗表(类型1 SCD),同时插入来自“新客户”流的行。在插入的行流中不应该有重复项;您可以通过将它们插入到临时表中并在最后插入维度表之前删除重复项来实现此目的。您还可以提取重复项并将其路由回加载过程以更新客户记录;它们可能包含更新的数据 - 例如更新的电话号码或类似信息。
客户进入后,加载事实。
事实表应该类似于:
DateKey (PK)
CustomerKey
OrderNumber (PK)
Total
我使用了DateKey和OrderNumber的复合主键,允许订单号序列不时重置。
在加载过程中,修改事实记录,使其类似于:
DateKey CustomerBusinessKey OrderNumber Total
20100201 john_smith_101 111 500
20100301 john_smith_101 222 600
此时,我们需要使用查找从维度表中将CustomerBusinessKey替换为CustomerKey。因此,在查找之后,流将如下所示:
DateKey CustomerKey OrderNumber Total
20100201 12345 111 500
20100301 12345 222 600
现在可以将其插入到事实表中。
我也有点作弊 - 没有从dimDate查找日期键,也没有查找事实表中的现有行。加载事实表时,您可以在加载之前查找现有(DateKey,OrderNumer)组合,也可以将其保留到主键以保护重复项 - 您的选择。在任何情况下,请确保尝试将相同数据重新加载到事实表中失败。