2014-10-08 103 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