微軟BI 之SSAS 系列 - 多維數據集維度用法之三 多對多維度 Many to Many


開篇介紹

對於維度成員和事實數據直接的關系看到更多的可能還是一對一,一對多的關系。比方在事實維度(或退化維度)中一個訂單和明細號組合而成的ID,對應的就是事實表中的一條數據,這就是一對一的關系。比方說在產品維度中,一個產品維度成員可能對應着多個事實數據成員,這就是一對多的關系。說簡單點,就是事實表的外鍵引用了維度表的主鍵,形成了這種關系。

下面的這個例子就是一種多對多的情況,通常情況下,如果維度和度量值組中間是多對多的關系,那么在它們之間就需要創建一個中間事實表。 這個中間事實表的主鍵在數據倉庫中可以不需要設計,包括與左側維度表和右側事實表之間的主外鍵關聯也不需要設計,直接在數據源視圖中修改邏輯關聯就可以了 (在我的腳本代碼中為了方便都主動的加上了主外鍵關聯)。

如果要在 DimSalesReason 和 FactInternetSales 建立關聯的話,那么就需要通過定義多對多關系來實現。

DimSalesReason - 銷售原因維度,即每筆訂單都會對應一個或者多個銷售原因,比如因為價格原因和產品推廣原因客戶購買了,或者就是單單價格原因客戶購買了。

類似於這種結構,我們一般可以這樣來操作:

  1. 第一步:基於 DimSalesReason 維度表創建一個常規維度 Sales Reason。
  2. 第二步:基於 FactInternetSales 事實表創建一個事實維度 InternetSalesFact。
  3. 這樣一來在定義維度用法時:
  4. 第三步:SalesReason 對度量值組 Internet Sales Reason (即FactInternetSalesReason) 將形成一種一對多的關系,常規用法。
  5. 第四步:InternetSalesFact 對度量值組 Internet Sales Reason (即FactInternetSalesReason) 將形成一種一對多的關系,常規用法。
  6. 第五步:InternetSalesFact 對度量值組 Internet Sales (即FactInternetSales)將形成一種一對多的關系,事實用法。注:廣義上來講,這里的一對多關系其實也包含了一對一的關系。
  7. 第六步,最后 Sales Reason 維度將借助於 度量值組 Internet Sales Reason 關系到事實維度 InternetSalesFact,並通過事實維度 InternetSalesFact 關聯到度量值組 Internet Sales而形成一種多對多的關系。

第一步

首先還是先將 DimSalesReason 這個維度創建好。

第二步

添加一個事實維度,選擇事實表 FactInternetSales。由於事實表並不存在類似於維度的 NameColumn 描述信息,並且這個事實表也非常的特殊,因為它是由 SalesOrderNumber 和 SalesOrderLineNumber 共同組成的主鍵列。由於相對而言 SalesOrderNumber 比 SalesOrderLineNumber 更有意義一些,這里選擇 SalesOrderNumber 作為 Name Colum。

不需要與其它的維度進行關聯。

不需要太多的屬性,就留一個主 KEY 就可以了。

下一步並將維度名稱命名為InternetSalesFact, 把 Fact 寫在最后表示它是一個事實維度。

兩個維度創建好了之后,保存並部署項目,同時修改 Cube 向 Cube 添加一個度量值組 - Fact Internet Sales Reason,這個維度只是一個中間維度。

可以隱藏 Fact Internet Sales Reason Count 度量值,因為實際上沒有特別大的意義,講它的 Visible 屬性設置為 False。

一會將度量值組名稱改為 - Internet Sales Reason。

保存並部署,然后編輯多維數據集的維度用法, 添加 SalesReason 維度后在 SalesReason 與 Internet Sales Reason 之間默認出現一個 Sales Reason。

第三步

SalesReason 對度量值組 Internet Sales Reason (即FactInternetSalesReason) 將形成一種一對多的關系,常規用法。

點擊查看它們默認的關系,注意這里只是 SalesReason 維度和這個中間度量值組之間的關系,實際上 SalesReason 和 Internet Sales 之間是沒有關聯的。

在維度用法中添加新的維度即事實維度 InternetSalesFact,將表現第四步和第五步的行為。

第四步

InternetSalesFact 對度量值組 Internet Sales Reason (即FactInternetSalesReason) 將形成一種一對多的關系,常規用法。

第五步

InternetSalesFact 對度量值組 Internet Sales (即FactInternetSales)將形成一種一對多的關系,事實用法。

第六步

最后 Sales Reason 維度將借助於 度量值組 Internet Sales Reason 關系到事實維度 InternetSalesFact,並通過事實維度 InternetSalesFact 關聯到度量值組 Internet Sales而形成一種多對多的關系。

可以看到 SalesReason 和 InternetSales 之間形成了多對多關系。

保存並部署,瀏覽一下 Cube 中的數據。可以看到訂單號為 SO43697 的這筆訂單有兩個銷售原因 - Manufacturer 和 Quality,雖然兩個銷售原因對應的銷售額都是 3578美元,但是這仍然是屬於一筆訂單,因此看到銷售類別 Other 的 Internet Sales Amount 還是顯示的是 3578 美元。

數據庫中的訂單對應了兩個銷售原因,但它的銷售額仍然是 3578.27 而不是 兩個 SalesAmount的總和。

參看與本文相關的文章如下

SSAS 系列 - 多維數據集維度用法之一 引用維度 Referenced Dimension

SSAS 系列 - 多維數據集維度用法之二 事實維度(退化維度 Degenerate Dimension)

引起爭論的結論

雖然這篇文章講到了多對多維度的實現,但是實際開發中盡量避免使用這種關聯關系,因為多對多的關系處理在數據聚合上效率肯定比通常一對一,一對多的效率要低很多。同時由於在建立多對多關系的時候需要額外創建一個事實維度來實現這種多對多的關聯,因此額外的事實維度需要被創建,在維度處理上變得更復雜,個人建議在設計的時候應該盡量避免這種關系的出現。

PS

感謝各位在本貼的留言,回復與討論。上面的這個結論下的有點不嚴謹,個人觀點,希望不會誤導大家,不過大家可以充分討論。關於這個多對多的設計能否在某些場景下避免的問題,我保留我的意見,這個問題待續。

更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)    如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM