具有空白尺寸的事實表
我可以在事實表中使用空白維度嗎?
例如,佛羅里達州的總銷售額為 200。
Sales City State 100 Miami 100 Tampa 200 Florida
原因是城市的總數可能有指標,例如僅在城市記錄中可用的銷售人員數量。州的總計可能具有僅在州內可用的指標,例如費用,並且沒有真正的方法將其分解為城市。
這可能是一個壞主意,絕對不是標準的良好做法。
在數據倉庫的典型事實/維度模式中,基於 Ralph Kimball 的方法,事實表應始終盡可能以最精細的級別儲存數據。您的範例事實表以兩個不同的粒度級別儲存數據。這很糟糕,因為它重複了兩次相同的事實。事實表旨在變得非常深(很多行),並且設計上的重複不會很好地擴展。我將回答你的問題,但也會展示如何避免這種重複。
事實表設計的另一個原則是它們應該盡可能窄(列數少),而其中的列應該盡可能緊湊(儲存空間最小)。這最大限度地減少了具有如此多行的表的儲存影響。
因此應避免在事實表中儲存字元串:相反,將整數外鍵儲存到維度表中,該表包含較大的字元串值。因此,每個字元串只儲存一次(在淺表、幾行、維度表中),較小的字元串
int
在深度事實表中重複多次。一旦你決定了,實際上,你只需要一個外鍵維度 ID 列來代表你的列
City
和State
列 - 因為如果你知道城市,你天生也知道州,每個城市只在一個州。這些描述符(和Country
)應該是 Location(或 Geography、Territory 或其他)維度中的列。您引用的指標也屬於維度表中的列。該維度的每個城市都有一個主鍵。事實表
LocationId Sales 1 100 2 100
位置尺寸表
LocationId City State Country SalesPeopleInCity StateExpenses 1 Miami Florida USA 2 Tampa Florida USA
您的範例事實表現在只需要前兩行 - 重複問題消失了!如果要查找佛羅里達州的總銷售額,請將事實表連接到維度表,限制
State
列,然後分組以查找sum
銷售額。(除此之外:在一個不錯的數據庫平台上使用良好的索引策略,即使您的事實表變得非常大(數百萬/數十億行),這可能根本不會花費很長時間。如果很多人需要找到很多不同的總計很多次…?這就是存在預聚合 OLAP 立方體技術的原因。)
如果需要,維度表在某些列中包含空白(或空值)以及包含重複值更容易接受。這樣做的基本原理是維度表相對於事實表永遠不會有那麼多行:儲存不是問題。因為這不是事務系統數據庫,所以一致性也不是問題。
因此,您的僅適用於州級別的指標可以針對維度表中每個適用的城市行重複。在這個簡單的範例中,您根本不需要任何空格。通過在每個適用行上重複值,無論正在分析哪個城市,您都可以立即獲得州級值。
位置尺寸表
LocationId City State Country SalesPeopleInCity StateExpenses 1 Miami Florida USA 6 $2500 2 Tampa Florida USA 2 $750
這一切都假設您希望使用簡單的“星型模式”數據模型。對此進行建模的另一種方法是使用“雪花模式”,將位置維度視為層次結構,並在不同的表中對層次結構的每個級別(城市、州、國家)的數據進行排序。然後度量將進入適當的級別表,或者可能進入一些通用屬性(鍵/值)表。
每種方法都有利有弊,主要取決於您將如何使用數據。