在尝试使用Talend构建数据仓库应用程序时,我们面临以下情况。
我们有两个表格看起来像
表大师
ID | CUST_NAME | CUST_EMAIL
------------------------------------
1 | FOO | FOO_BAR@EXAMPLE.COM
活动表
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
master和events table之间有一对多的关系。因为,鉴于有限数量的事件名称,我建议将这个结构反规范化为看似
的结构。ID | CUST_NAME | CUST_EMAIL | ACC_APP_DATE_ID | ACC_OPEN_DATE_ID |ACC_CLOSE_DATE_ID
-----------------------------------------------------------------------------------------
1 | FOO | FOO_BAR@EXAMPLE.COM | 20140101 | 20140102 | 20140103
DATE_ID
列引用时间维度表中的条目。
第一个问题:这是个好主意吗?该计划的其他替代方案是什么?
第二个问题:如何使用Talend Open Studio实现此功能?我想出了一种方法,我使用tMap
组件将每个事件名称的数据移动到它自己的临时表以及cust_id,然后使用另一个tMap
将它们链接在一起。在talend还有另一种方法吗?
答案 0 :(得分:1)
是的,这是一个好主意,这称为累积快照事实。 http://www.kimballgroup.com/2012/05/design-tip-145-time-stamping-accumulating-snapshot-fact-tables/ 不知道如何在Talend中执行此操作(不知道该工具),但使用Case或Pivot语句在SQL中实现非常容易
答案 1 :(得分:1)
仅针对您的第一个问题,这当然是一个好主意 - 除非有相同的人可能不止一次申请 - 开启 - 关闭他们的帐户 AND 将所有这些信息保存在历史记录中(因此UPDATE不会提供帮助)。
答案 2 :(得分:1)
要在Talend中执行此操作,您需要首先对数据进行排序,使其可靠地按照应用,打开和关闭的顺序对每个帐户进行排序,然后将其非规范化为单行,并使用单个分隔字段使用tDenormalizeRows组件的日期。
在此之后,您将要使用tExtractDelimitedFields来拆分单个日期字段。
答案 3 :(得分:1)
如果要设计数据仓库,雪花绝对不是一个好选择。因此,在这种情况下,非规范化肯定是一个不错的选择。以下文章几乎非常适合在这种情况下清除空气,
http://www.kimballgroup.com/2008/09/design-tip-105-snowflakes-outriggers-and-bridges/