将多个支腿表合并为一个?

时间:2017-06-07 18:07:53

标签: sql data-warehouse dimensional-modeling

我有一张尺寸表和几个支腿。

create table dimFoo (
    FooKey int primary key,
    ......
)

create table triggerA (
    FooKey int references dimFoo (FooKey),
    Value varchar(255),
    primary key nonclustered (FooKey, Value)
)

create table triggerB (
    FooKey int references dimFoo (FooKey),
    Value varchar(255)
    primary key nonclustered (FooKey, Value)
)

create table triggerC (
    FooKey int references dimFoo (FooKey),
    Value varchar(255)
    primary key nonclustered (FooKey, Value)
)

这些支腿表是否应该合并到一个表中?

create table Triggers (
    FooKey int references dimFoo (FooKey),
    TriggerType varchar(20), // triggerA, triggerB, triggerC, etc....
    Value varchar(255),
    primary key nonclustered (FooKey, TriggerType, Value)
)        

1 个答案:

答案 0 :(得分:0)

为了满足这种情况,例如dimCustomer与客户可能有多种爱好,典型的Kimball方法是在维度之间使用Bridge表(dimCustomer和dimHobby)。

This link提供了桥接表如何解决此问题以及可能更适合您的替代方案的摘要。

在不了解您的具体方案的情况下,包括业务需求,您拥有的这些值类型中的多少,各种值类型和值的“统一”以及您将用于访问的BI技术数据,很难给出一个明确的答案,你是否应该将桥梁组合成一个满足各种多样化的超级桥梁。以上所有都会在一定程度上影响答案。

通常,“通用表”方法在管理的幕后比在呈现分析时更有用。我的默认方法是使用特定的桥接表,直到/从ETL角度来看这变得无法管理,或者从用户查询的角度来看,它更加复杂。我不打算从一开始就“优化”到组合表中。

如果你的情况超出了通常的规范(根据你的例子你有三个,还是十个?),结合起来可能是一个好主意。这将使它更像是一个无事实的事实,其尺寸为dimCustomer,dimValueType和dimValue,并且是一个非常合理的解决方案。