2011-02-08 95 views
10

我正在設計一個數據倉庫,並且隨着時間的推移我有一個棘手的問題。我需要的穀物是每小時(計算每小時事件的總計數),而且我還必須適應在24小時內不適合的換擋模式(事實上,'藍色'換擋可能不會覆蓋相同幾天的時間)。日期/時間維度

考慮到這一點,我考慮的一個3接近

  1. 一個時間維度與它175K行。
  2. 雪花時間維度,日曆維度爲7300行,時間維度爲175k行
  3. 單獨的維度,以便事實表具有事件日期和事件時間的外鍵。

我傾向於方法3,因爲它允許小日曆維度在連接中單獨引用,但是我會很感激任何想法。

+0

你的數據如何派生:我會認爲任何日曆維度將是8766或8784(取決於你是否使用365.25 * 24或366 * 24);同樣我不明白你的175k行的時間維度 - 它不是自然地從我看過的任何時間觀點出現的? – 2011-02-08 08:10:03

+1

我近似於365天* 20年= 7300行,然後175k大約24小時* 7300行。 – dfoster99 2011-02-08 08:23:06

回答

2

我它是什麼值得0.02£:

假設有考慮移位(@Andriy M的問題)所引起的任何額外的問題:

我會傾向於打折選項2,除非有是一個特定的好處(性能,一類查詢的簡化等),你可以從採用它看到。你沒有描述任何這樣的好處,所以看起來你爲自己的緣故增加了複雜性。

我個人的偏好是選擇1 - 概念上最簡單,最直接,和(IMO)最適合數據倉庫方法。

選項3有你提到的優點,但我有嘮叨的懷疑,它涵蓋了兩種選擇:在日曆維度是你描述它,但時間維度的選擇是175k行,或24。目前還不能爲這兩種選擇中的任何一種提供參數,只有直覺纔有這種選擇。如果這個轉變問題與此有關,它可能會影響這些替代方案之間的選擇(如果它們是真正的替代方案)。

如果您希望進一步考慮選項2,則選項3中的備選方案也是相關的。

6

是,製造業的變化是棘手和不隨時間而改變,往往一個班次開始前一天,等

請記住,有兩種曆法這裏。一個是標準日曆和另一個是生產日曆 - 該轉變屬於生產日曆。一般來說,生產日曆中的一天可能會持續更多(或更少)24小時以上。

例如:在週一產生

部分,2011-02-07 23:45可能看起來像

TimeOfProduction = '2011-02-07 23:45' 
DateKey = 20110207 
TimeKey = 2345 
ProductionDateKey = 20110208 (the first shift of the next day started at 22:00) 
ProductionTimeKey = 145 (1 hour and 45 minutes of the current production date)  
ShiftKey = 1 
ShiftTimeKey = 145 (1 hour and 45 minutes of the current shift) 

所以,我的建議是:

  1. 平原Date Dimension(一個每行日期)
  2. Plain Time Dimension(每行一分鐘24小時= 1440行+請參閱下面的註釋)
  3. Shift Dimension - 型2維與rw_ValidFrom, (rw_ValidTo) , rw_IsCurrent
  4. 角色的玩DateKeyProductionDateKey
  5. 角色的玩TimeKeyProductionTimeKeyShiftTimeKey
  6. TimeOfProduction (datetime)也保存在事實表中。
  7. 在ETL過程中,應用當前的移位邏輯將ProductionDateKey, ProductionTimeKey, ShiftKey, ShiftTimeKey附加到factPart表的每一行。

注意,您可能需要額外的行添加到Time Dimension如果生產一天可以持續24小時以上。如果使用當地時間,並且有夏令時跳轉,通常情況下可以。

因此,星可能是這個樣子

enter image description here

1

我會選擇選項3 - 獨立的尺寸。優點:

  • 簡單性 - 兩個相對較小的表格 - 由於一天中的固定分鐘數是固定的,因此時間維度僅加載一次。

  • 重用 - 2種separete尺寸更容易與可以通過具有在一個事實表日期維度單獨的屬性僅具有日期或時間維度

  • 易分區其他事實表共享

  • 可擴展性 - 考慮您可以添加到日期和時間維度的屬性,以滿足報告需求的增長。對於日期維度,這可以是(避免每次從日期提取此信息):年,季度,月份,日期,星期,日期標籤(如「2011年9月12日」),月份名稱,工作日名稱,各種指標指標,季度末,月末等)。對於時間維度(可以 - 爲了準確性 - 包含一天中的每一秒),這可以是:小時,分鐘,秒鐘,日期部分標籤(例如「早晨」,「晚上」),工作時間指示器(從8: 00:00到17:00:00)等等。但僅僅在一個維度上就意味着很多冗餘。

班次不與天開始/結束找一個單獨的事實寓言記錄開始和結束時間戳爲每個班次對準我作爲一個很好的候選人 - 我的意思是(非事實)的事實表具有以下外鍵:id_date_start,id_time_start,id_date_end,id_time_end。然後,您可以從事件事實表「鑽取」到輪班表以獲得每個班次的彙總結果。

編輯:或者模型轉變就像另一個層面 - 如果你轉移是要與它的屬性獨立跟蹤(但此刻我不能想到一個重要的業務流程依賴於這樣的事實任何其他屬性然後日期&時間...位置,也許?)或者它只是一個事件的上下文(因此應該只是一個維度)。