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' 

这种方法更适合在您需要分析属于同一个地址的客户之间的关系的情况。

不知道你是否正在寻找这个,但希望答案将有助于你的可视化和设计。