如何平衡一对多的关系

时间:2014-10-08 07:34:33

标签: sql data-warehouse talend dimensional-modeling

在尝试使用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还有另一种方法吗?

4 个答案:

答案 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/