2012-08-23 29 views
2

我希望有人能夠指出我關於何時計算存儲在數據倉庫中的計算值的一些最佳實踐。計算ETL期間或插入數據倉庫期間的計算列

考慮下面的例子,

CREATE TABLE 
(
    MyFactID INT NOT NULL IDENTITY(1, 1), 
    OrderDimID INT NOT NULL, -- FK To OrderDimension 
    StartDate DATETIME NOT NULL, 
    CompletedDate DATETIME NULL, 
    ElapsedCalendarTimeInMinutes INT NULL, 
    ElapsedBusinessTimeInMinutes INT NULL 
) 

在這個例子中,在分鐘的經過日曆時間將是從開始時間(以分鐘計)的結束日期。然後,我們的業務時間反映了這些日曆日期間可用的工作時間。

目前,我們在ETL中計算並插入兩個日期。我想知道這是否是執行此操作的正確位置。

一些其他的想法是對:

A)通過僅存儲開始和結束日期中的事實表,然後創建其計算以分鐘的經過時間和具有使用計算列的圖使用索引視圖一個計算工作日的函數。

B)插入或更新完成日期爲非空值後,使用After觸發器更新已發生日曆時間和業務時間。

我覺得這應該在數據庫中完成,以便如果對結束日期或計算業務時間進行任何更改,它都會反映出來。在ETL期間這樣做似乎很容易出現問題。

對此的任何想法表示讚賞!

更新:至少有6列以這種方式確定。我們有營業時間,時間和天數(我們的業務的天數爲12小時);那麼我們有客戶的分鐘,小時和天數(通過查找表確定客戶的工作時間);那麼我們只需要日曆分鐘,小時和天(儘管這些不會被存儲;只有幾分鐘)。由於這是一個數據倉庫,我預計所有的數據都會出現,不需要計算。對我來說,確保ETL是正確的並且應用到處,而不是創建一個超過基礎數據的視圖以獲得計算信息似乎需要做更多的工作。

+0

你爲什麼要在數據庫中做到這一點?一旦數據在ETL過程結束時到達數據庫,您就不應該修改它 - 唯一改變倉庫中的數據的東西應該是ETL(這在很大程度上就是您通常不需要數據庫的原因在倉庫中執行約束) –

+0

我想在數據庫中這樣做,這樣我們只需插入最少量的信息(例如開始和結束日期時間),並將其餘數據一致地計算在數據庫中在任何時間使用業務的時間都將通過相同的功能。使用ETL迫使我們確保加載所有表使用相同的進程,同時創建超過基本數據的視圖允許我們在邏輯改變時刪除並重新創建視圖。 – MPavlak

+2

「使用ETL迫使我們確保加載所有表使用相同的過程」 - 我認爲這是一件好事,因爲您正在執行規則。視圖可以很好,但不會表現得很好。您也可以在數據庫中執行ETL作爲「ELT」(提取 - 加載 - 轉換)。 –

回答

3

最簡單的方法應該是最好的解決辦法:

在你的ETL處理線(讓我們supose是SSIS但可以推斷其他技術):

  1. 創建data flow從複製表您的運營數據庫轉移到數據倉庫後臺。
  2. T-Sql task更新您的事實表。一個merge的說法應該是足夠了:

合併樣本:

MERGE Target AS T 
USING Source AS S 
ON (__ matching criteria ___) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(OrderDimID, startDate, ...) VALUES(...) 
WHEN MATCHED 
    THEN UPDATE SET T.ElapsedCalendarTimeInMinutes = ___some calculations___ 
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE (?) 

這避免誘發和索引視圖。

+0

我會研究這種方法,但爲什麼我們要避免意見/觸發器(只是好奇)? – MPavlak

+1

我儘可能避免觸發器:不容易調試,也應該記住所有存在的時間。關於視圖,在數據集市中,我更喜歡將所有數據物化,更快速地製作新索引,連接,搜索...。我不知道他們是否對這個問題「寫規則」,但是這只是我工作和爲我運行。 – danihp

+0

我將此標記爲接受的答案,但尚未探索解決方案。從答覆看來,這似乎是一個合理的解決方案。 – MPavlak