布尔或过滤的维度建模

Posted

技术标签:

【中文标题】布尔或过滤的维度建模【英文标题】:Dimensional Modelling for boolean OR filtering 【发布时间】:2014-01-20 07:42:53 【问题描述】:

维度建模如何满足布尔或过滤要求?

例如,假设维度Customer 具有HomeAddressIdBillingAddressId 属性。这两个字段都指向Address 维度。一些企业用户只关心家庭地址,其他用户只关心帐单地址,但有些用户希望过滤结果,例如“所有在德克萨斯州有帐单或家庭地址的客户”。

另一个示例:“联系人”维度可能具有属性Email1Email2,但过滤几乎总是针对两个字段而不是其中一个字段。

【问题讨论】:

【参考方案1】:

基于别名的方法

在这种方法中,Address 维度表将别名为HomeAddressBillAddress,这两个表中的ID 将链接到HomeAddressIdHomeAddressIdBillingAddressIdCustomer分别表。在这种设计模式中,当你提出这样的问题时,

账单或家庭住址在德克萨斯州的所有客户

它将转换为这样的查询:

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'

理想情况下,别名将在报告层(例如 SAP Business Objects 中的Universe)或查询层中定义。

桥接表法

在这种方法中,您将创建一个新的桥表来根据类型存储CustomerAddress 之间的关系。这种方法本身不是“维度”方法,但可以以 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'

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

不确定您是否正在寻找这个,但希望答案对您的可视化和设计有所帮助。

【讨论】:

以上是关于布尔或过滤的维度建模的主要内容,如果未能解决你的问题,请参考以下文章

维度建模的基本原则

数据仓库维度建模法案例

维度建模的10大基本原则

数据仓库设计要点

计划的数据仓库维度(维度建模)

维度建模中事实表的两个或多个相似计数