维度建模如何解决布尔或过滤要求?
例如,假设Customer
具有属性HomeAddressId
和的维度BillingAddressId
。两个字段都指向一个Address
维度。一些企业用户只关心家庭地址,其他用户只关心帐单地址,但有些用户希望过滤结果,例如“所有在德克萨斯州有帐单或家庭地址的客户”。
另一个示例:“联系人”维度可能具有属性Email1
和Email2
,但过滤几乎总是在两个字段上而不是在一个或另一个上。
维度建模如何解决布尔或过滤要求?
例如,假设Customer
具有属性HomeAddressId
和的维度BillingAddressId
。两个字段都指向一个Address
维度。一些企业用户只关心家庭地址,其他用户只关心帐单地址,但有些用户希望过滤结果,例如“所有在德克萨斯州有帐单或家庭地址的客户”。
另一个示例:“联系人”维度可能具有属性Email1
和Email2
,但过滤几乎总是在两个字段上而不是在一个或另一个上。
基于别名的方法
在这种方法中,Address
维度表将别名为HomeAddress
and BillAddress
,ID
这两个表中的表将分别链接到表HomeAddressId
的BillingAddressId
列Customer
。在这个设计模式中,当你问这样的问题时,
在德克萨斯州拥有账单或家庭住址的所有客户
它将转换为这样的查询:
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
根据类型进行存储。这种方法本身不是“维度”方法,但可以以Fact-less Fact table的形式用于维度建模。
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'
这种方法更适用于需要分析属于同一地址的客户之间的关系的情况。
不确定您是否正在寻找这个,但希望答案对您的可视化和设计有所帮助。