2

維度建模如何解決布爾OR過濾需求?布爾OR過濾的維度建模

例如,假設尺寸爲Customer,其屬性爲HomeAddressIdBillingAddressId。這兩個字段都指向一個Address維度。一些商業用戶只會關心家庭住址,其他人只會關心帳單地址,但有些用戶則希望過濾結果,例如「所有在德克薩斯州都有帳單或家庭住址的客戶」。

另一個示例:「聯繫人」維度可能具有Email1Email2的屬性,但過濾將幾乎總是位於兩個字段中,而不是一個或另一個。

回答

3

別名爲基礎的方法

在這種方法中,Address維度表將別名爲HomeAddressBillAddressID從兩個這兩個表將被分別鏈接到Customer表的HomeAddressIdBillingAddressId列。在這種設計模式,當你問這樣的問題,

所有客戶在德克薩斯州的帳單或家庭住址

這將轉化爲這樣的查詢:

SELECT Customer.* 
FROM Customer 
LEFT OUTER JOIN Address HomeAddress ON Customer.HomeAddressId = HomeAddress.Id 
LEFT OUTER JOIN Address BillAddress ON Customer.BillingAddressId = BillAddress.Id 
WHERE HomeAddress.Name = 'Texas' OR BillAddress.Name = 'Texas' 

別名將在報告圖層中理想定義(例如Universe,SAP Business Objects)或查詢圖層。

橋表編制方法

在這種方法中,您將創建一個新的橋接表根據類型來存儲CustomerAddress之間的關係。這種方法不是「三維」的方法,而是可以以尺寸建模的形式使用,其形式爲事實不多的事實表

CustomerID | Type | AddressID 
----------------------------------- 
1   | Home | 10 
2   | Home | 20 
2   | Bill | 30 
3   | Home | 10 
3   | Bill | 40 

在這種做法將採取的形式查詢,

SELECT DISTINCT Customer.* 
FROM Customer, CustomerAddress, Address 
WHERE Customer.ID = CustomerAddress.CustomerID 
AND Address.ID = CustomerAddress.AddressID 
AND Address.Name = 'Texas' 

這種方法更適合在您需要分析屬於同一個地址的客戶之間的關係的情況。

不知道你是否正在尋找這個,但希望答案將有助於你的可視化和設計。