2014-10-08 66 views
0

在尝试使用Talend构建数据仓库应用程序时,我们遇到了以下情况。如何扁平化一对多关系

我们有一个看起来像

表主

ID | CUST_NAME | CUST_EMAIL 
------------------------------------ 
1 | FOO  | [email protected] 

事件表

ID | CUST_ID | EVENT_NAME | EVENT_DATE  
--------------------------------------- 
1 | 1  | ACC_APPLIED | 2014-01-01 
2 | 1  | ACC_OPENED | 2014-01-02 
3 | 1  | ACC_CLOSED | 2014-01-02 

有主站和事件表之间存在一个一对多的关系的两个表的表。由于给定的事件名称数量有限,我建议将该结构非规范化为看起来像

ID | CUST_NAME | CUST_EMAIL   | ACC_APP_DATE_ID | ACC_OPEN_DATE_ID |ACC_CLOSE_DATE_ID  
----------------------------------------------------------------------------------------- 
1 | FOO  | [email protected] | 20140101  | 20140102   | 20140103 

THE DATE_ID列是指时间维度表内的条目。

第一个问题:这是个好主意吗?这个计划的其他选择是什么?

第二个问题:我如何使用Talend Open Studio来实现这个功能?我想出了一种方法,将每个事件名称的数据与cust_id一起使用tMap组件移到它自己的临时表中,然后使用另一个tMap将它们链接在一起。有没有另外一种方法可以做到这一点?

回答

1

要在Talend中做到这一点,您需要首先对数据进行排序,以便按照每个帐户的应用,打开和关闭的顺序对其进行可靠的排序,然后将其非规范化为具有单个分隔字段的单行日期使用tDenormalizeRows组件。

在此之后,您需要使用tExtractDelimitedFields来拆分单个日期字段。

+0

非常感谢。这也会起作用。如何使用tPivotToColumnsDelimited组件? – Bazooka 2014-10-08 11:23:03

+0

tPivotToColumnsDelimited输出分隔文件,因此不适合您的需要。可以说,你可以输出一个临时文件,然后再读回来,但是对于你的用例来说这很麻烦和不必要。 – ydaetskcoR 2014-10-08 14:39:25

+0

我同意。谢谢。 – Bazooka 2014-10-08 14:57:14

1

对于只有你的第一个问题在SQL来实现,它肯定是一个好主意 - 除非可能有同一人申请开立并关闭其账户的不止一次你想保留所有这些信息在他们的历史记录中(所以更新不会有帮助)。

+0

感谢您的输入。但这不会是一个问题,因为真正的结构包含每个账户持有人的天然钥匙。 – Bazooka 2014-10-08 09:09:50