2014-01-27 86 views
1

我有一個數據集市,只需要捕獲產品序列號,活動日期以及活動發生的地點(哪個帳戶)。事實表推薦

有五種可能的活動。我有這個問題。其中兩項活動在倉庫層面進行。其餘三個帳戶級別(WH不適用)。但是,最終每個倉庫都會彙總到一個主帳戶。

所以,如果我有一個事實表,我基本上需要兩個FK,你將不得不遍歷事實表來建立WH>帳戶層次結構,這似乎很難維護。我想要一個維度表。

或者是否推薦我將它分成兩個事實表,即使兩個表中唯一不同的特徵是活動是否發生在倉庫中。

報告的目標將在帳戶級別,但在某些時候讓WH信息可能有用。而且我需要檢查重複項等,這就是爲什麼我傾向於第一個,但不知道如何正確處理層次結構。

一個事實表設計

  • 資料:
  • 帳戶:14
  • 倉庫:2
  • ActivityType:3
  • 日期:20130204
  • 的SerialNumber:123456
  • 計數:1

雙事實表設計

表1

  • 資料:
  • 倉庫:2
  • ActivityType:3
  • 日期:20130204
  • 的SerialNumber: 123456
  • 計數:1和

表2

  • 檔案:1
  • 帳戶:2
  • ActivityType:3
  • 日期:20130204
  • 的SerialNumber:123456
  • 計數:1
+0

如果您在事實表中同時存儲倉庫和帳戶,爲什麼難以「打造WH>帳戶」層次?聽起來在您的報告中,您將忽略倉庫字段並在帳戶上進行彙總。 – David

+0

大衛,我從這個角度意味着如果我想再次看到在某些時候完整的層次,我會用事實表的鏈接。雖然我想這可能不是問題。我猜爲什麼我質疑這種方法是因爲兩者之間的層次關係如此緊密,似乎是將它們保持在同一維度的最佳實踐。雖然聽起來這可能是我最好的選擇? – ElPresidente

回答

2

伊夫解釋你的情況爲:

  • 所有活動需要一個帳戶
  • 一些活動涉及 倉庫。
  • 倉庫的選擇意味着一個帳戶。上述在兩個點中提到 帳戶是相同類型的(有 只有1帳戶維度表)

在這種情況下應該是與單FACT表設計行:

[ACTIVITY_FACT] 
SK     (Optional, i find unique surrogate PKs useful) 
ITEM_SK    (Link to your ITEM_DIM table) 
ACCOUNT_SK   (Link to your ACCOUNT_DIM table) 
WAREHOUSE_SK   (Link to your WAREHOUSE_DIM table, -1 for no warehouse activities) 
ACTIVITY_TYPE_SK  (Link to your ACTIVITY_TYPE_DIM table) 
ACTIVITY_DATE_SK  (Link to your DATE_DIM table) 
ITEM_SERIAL_NUMBER 
ITEM_COUNT 

在WAREHOUSE維度中記錄爲NONE或NOT APPLICABLE,併爲其分配一個很好的明顯特殊條件SK值-1或-9或任何您的店鋪用於此類事情。

對於引用倉庫的活動記錄,將相應的倉庫sk和屬於該倉庫的帳戶sk放在一起。

對於不涉及倉庫的活動,使用NONE/NOT APPLICABLE倉庫維度記錄和適當的賬戶SK填充倉庫sk。現在

事實表可以連接到您的賬戶和倉庫維度表,而不必擔心外連接或空條件處理。這應該允許您和您的用戶根據需要使用倉庫維度數據,並且不必費盡周折地管理包含基本相同日期的兩個表。

+0

謝謝喬。我結束了使用這種方法 – ElPresidente

1

一種可能性是在一維表來定義層級。猜測你在處理什麼,我想出了以下內容。

外形尺寸表:

TABLE: Account 

Account_ID <surrogate key> 
Account  <Account name, identifier> 
Warehouse (Warehouse name, identifier) 

的樣本數據:

Account_ID Account Warehouse 
    1   A  n/a 
    2   B  n/a 
    3   C  n/a 
    4   W  wh1 
    5   W  wh2 
    6   Z  wh3 
    7   Z  n/a 

ACCOUNT_ID只是一個代理鍵,有沒有內在的意義或價值

帳戶列表中的帳戶。在這裏,我顯示五,A,B,C,W和Z.選擇不同的帳戶列表;通過Account_ID加入到事實數據表中,其中Account =「W」獲取該賬戶的所有數據(對於多個倉庫(如果適用))。

倉庫列出了所有倉庫和它們所關聯的帳戶;在這裏,「W」是兩個獨立倉庫(wh1,wh2)的帳戶; Z與倉庫wh3相關聯,但也可以用「沒有」倉庫的事實表使用。通過Account_ID加入事實表,其中Warehouse =「wh1」獲取該倉庫的所有數據。

通過在事實表中使用Account_ID,您可以深入瞭解任何給定帳戶或特定倉庫(或沒有倉庫,如果有價值的話)的所有條目。

有許多變化和排列可能用這種方法。

+0

感謝菲利普。我最終使用了喬的方法,但我也在考慮這個。這兩種方法都有道理,但我可能最終會重新考慮這一點。 – ElPresidente