2012-06-14 54 views
2

我正在爲VoIP服務創建關於「呼叫記錄系統」的維度模型。 我將舉例說明一個小例子來展示我的問題。尺寸建模 - 無事實查詢

假設我有一個事實表示一次調用。我有一個叫做Client的維度,另一個叫做Provider。 (假裝有其他尺寸,當然一樣的日期,等..)

(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider 

有了這個,我就可以看到有多少調用客戶端做了,或有多少電話是通過發送提供者和其他問題。

而且讓我們假設一個客戶端與一個提供者關聯,並且一個提供者可以擁有多個客戶端。

所以,問題來了。嗨,我可以創建一個查詢,如:每個提供商有哪些客戶端?

它似乎是一個查詢,只是在兩個維度之間。我不能涉及這個事實,因爲如果客戶端從未使用該服務,他不會在呼叫事實表上,並且他不會在這個「每個提供商的客戶端」查詢上進行操作。

我一直在想,要做到這一點的一種方法是創建一個角色扮演維度,一個客戶維度的視圖,並將其直接添加到提供者維度,以便執行像這樣的查詢。這將是這樣的:

(Dimension)Client ---> (Fact)Call <--- (Dimension)Provider <--- (Dimension)View Client 

當然,使用這種方法,用戶必須非常小心,以不使用與事實表這個View Client的尺寸,因爲它會重複的事實行。

那麼,這是我需要使用着名的非事實型事實表的情況之一嗎?

什麼是正確的方法來做到這一點?

謝謝!

回答

1

當您在同一個事實表中「回收」多次使用的維度時(即呼叫日期,服務日期等),應使用角色扮演維度。

這聽起來不像你想要的那樣。相反,如果關係真的是一對多關係,那麼我只需將提供者ID直接添加到客戶維度上(不需要視圖或任何東西),並認識到這種關係與事實無關。

從本質上講,當涉及到這種查詢時,將「提供者」看作僅僅是客戶端的一個屬性。

但是,聽起來您可能希望確定客戶端和提供者之間沒有多對多關係(客戶端可以使用多個提供者,而提供者可以有多個客戶端)。多對多關係建模爲一個事實表。您的事實表可能是當前時間點的快照,有或沒有歷史記錄。只需要兩列,即ClientProvider。如果您想在某個時間範圍內記錄客戶/供應商關係,則只需添加日期戳即可。

請注意,一個沒有事實的事實也可以模擬一對多關係(如果模型在後端更改,您的ETL已經完成..)