2010-03-26 77 views
1

我正在使用Talend来填充数据仓库。我的工作是将客户数据写入维度表并将事务数据写入事实表。事实表上的代理键(p_key)是自动递增的。当我插入新客户时,我需要我的事实表来反映相关客户的ID。ETL操作 - 返回主键

正如我所提到的,我的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

什么是您的仓库使用的RDBMS? –

回答

4

我可能误会你然而问题:

  1. 事实表可能会或可能不会有自动递增的PK,通常在事实表中的PK是几个FKS引用维度表的复合。

  2. 维度表应该有一个自动递增的PK。

  3. 在交易事实达到DW(或至少事实表)之前,新客户应该“登陆”到客户维度表中。

  4. 维度表应该有一个BusinessKey,它可以唯一标识一个客户 - 如电子邮件,全名+ pin或类似的。

  5. 传入交易行也应该有客户BusinessKey字段 - 这就是我们如何识别客户。

  6. 在将事务插入事实表之前,使用BusinessKey查找客户维度表中的客户PrimaryKey。

编辑

如果你的新客户数据与交易捆绑,找到一种方法,客户数据和路由其提取到DW未来的交易。

UPDATE:

负载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和订单编号的复合主键,允许订单号序列从时间重置时间。

在加载过程中,修改的事实记录看起来是这样的:

DateKey CustomerBusinessKey OrderNumber Total 
20100201 john_smith_101  111  500 
20100301 john_smith_101  222  600 

在这一点上,我们需要从使用查找维度表中CustomerKey更换CustomerBusinessKey。因此,在查找后流将如下所示:

DateKey CustomerKey OrderNumber Total 
20100201 12345  111   500 
20100301 12345  222   600 

这现在可以插入到事实表。

我也欺骗了一下 - 没有从dimDate中查找日期键,也没有查找事实表中的现有行。加载事实表时,您可以在加载之前查找现有的(DateKey,OrderNumer)组合,也可以将其保留至主键以保护重复项 - 您的选择。在任何情况下,确保尝试将相同的数据重新加载到事实表中失败。

+0

Damir,请参阅更新信息。 – user302254

+0

谢谢达米尔。你教了我一吨。 – user302254

+0

这里没有声望,所以我不能“投票”。 – user302254