sql多值维度

时间:2014-12-03 08:43:12

标签: sql-server data-warehouse business-intelligence dimensional-modeling

(这是我提出的第一个问题所以请在这里与我一起讨论)

我在SQL Server 2014 Enterprise上创建了一个数据仓库,并且我正在努力将事实映射到一个维度中的多个值。

想象一个数据中心,其中包含为特定服务和客户保留的服务器。 这些服务器具有特定组件,如网络适配器,cpu或操作系统。

我的事实表中的几行看起来像这样:

ServerID   CustomerID   OSID   ServiceID   NetworkGroupID  CPUID
1           1            1        1           1               1
2           1            2        1           2               1
3           2            1        2           2               2

服务器1和2属于客户1.服务器1运行OS 1,另一个运行OS 2.两者都提供服务1。 服务器1有一组网络适配器,标识为' 1',另外2.这些集包含多个网络适配器(一些是虚拟的,一些是物理的)。

我的网络维度具有属性ID和NetworkAdapterName,我需要ID多次出现:

ID   NetworkAdapterName
1      IntelAdapter#1
1      IntelAdapter#2
1      VirtualAdapter#1
2      IntelAdapter#1
2      DellAdapter#1
3      VirtualAdapter#1
3      VirtualAdapter#2

我认为我需要某种子维度作为这样的桥梁:

NetworkGroupID   NetworkID
  1              1
  1              2
  1              3
  2              1
  2              5
  3              3
  3              4

NetworkID NetworkAdapterName
1         IntelAdapter#1
2         IntelAdapter#2
3         VirtualAdapter#1
4         VirtualAdapter#2
5         DellAdapter#1

但是,我怎么能够从事实表到桥维度定义主键或关系,因为有多个与NetworkGroupID相同值的外观?

(CPU和操作系统也是如此,但是一旦我为网络适配器工作,我也可以为其他组件工作。)

编辑: 最后,我想在SSAS中构建一个可以向我显示一个服务器具有多个组件的多维数据集。

1 个答案:

答案 0 :(得分:0)

您可以创建定义NetworkGroup的表格(或维度):

CREATE TABLE NetworkGroup (
    NetworkGroupID int          not null PRIMARY KEY,
    Name           nvarchar(50) null
);

然后使用你的"桥接"表(a.k.a。Junction Table)将其与Network表格连接起来:

CREATE TABLE NetworkGroupNetwork (
    NetworkGroupID int not null,
    NetworkID      int not null,

    CONSTRAINT PK_NetworkGroupNetwork
        PRIMARY KEY (NetworkGroupID, NetworkID),

    CONSTRAINT FK_NetworkGroupNetwork_NetworkGroup
        FOREIGN KEY (NetworkGroupID)
        REFERENCES NetworkGroup (NetworkGroupID),

    CONSTRAINT FK_NetworkGroupNetwork_Network
        FOREIGN KEY (NetworkID)
        REFERENCES Network (NetworkID)
);