维度建模如何解决布尔OR过滤需求?布尔OR过滤的维度建模
例如,假设尺寸为Customer
,其属性为HomeAddressId
和BillingAddressId
。这两个字段都指向一个Address
维度。一些商业用户只会关心家庭住址,其他人只会关心帐单地址,但有些用户则希望过滤结果,例如“所有在德克萨斯州都有帐单或家庭住址的客户”。
另一个示例:“联系人”维度可能具有Email1
和Email2
的属性,但过滤将几乎总是位于两个字段中,而不是一个或另一个。
维度建模如何解决布尔OR过滤需求?布尔OR过滤的维度建模
例如,假设尺寸为Customer
,其属性为HomeAddressId
和BillingAddressId
。这两个字段都指向一个Address
维度。一些商业用户只会关心家庭住址,其他人只会关心帐单地址,但有些用户则希望过滤结果,例如“所有在德克萨斯州都有帐单或家庭住址的客户”。
另一个示例:“联系人”维度可能具有Email1
和Email2
的属性,但过滤将几乎总是位于两个字段中,而不是一个或另一个。
别名为基础的方法
在这种方法中,Address
维度表将别名为HomeAddress
和BillAddress
和ID
从两个这两个表将被分别链接到Customer
表的HomeAddressId
和BillingAddressId
列。在这种设计模式,当你问这样的问题,
所有客户在德克萨斯州的帐单或家庭住址
这将转化为这样的查询:
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)或查询图层。
桥表编制方法
在这种方法中,您将创建一个新的桥接表根据类型来存储Customer
和Address
之间的关系。这种方法不是“三维”的方法,而是可以以尺寸建模的形式使用,其形式为事实不多的事实表。
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'
这种方法更适合在您需要分析属于同一个地址的客户之间的关系的情况。
不知道你是否正在寻找这个,但希望答案将有助于你的可视化和设计。