0

我的数据源 DimAddress 和 DimGeoInforamtion 中有两个维度。如果我想使用地址表中的层次结构,我将从 DimAddress 表中获取地址、城市和邮政编码,但我将从 DimGeoInformation 表中获取状态。我如何在它们之间创建层次结构>?

CREATE TABLE DimAddress
(
    [AddressID] [int]IDENTITY(1,1) NOT NULL,
    [Address] [varchar](MAX) NULL,
    [ZipCode] [Varchar(5)] NULL,
    [AddressSpatialID] [int] NULL,      
    [City] [varchar](50) NULL,
    [CitySpatialID] [int] NULL,
    [CityID] [int] NOT NULL
)

CREATE TABLE DimGeoInformation
(
    [CountyID] [int] IDENTITY (1,1) NOT NULL,
    [County] [varchar](50) NULL,
    [CountySpatialID] [bigint] NULL,    
    [StateID] [tinyint] NOT NULL,
    [State] [varchar](25) NOT NULL,
    [RegionID] int
    [RegionName] varchar(50)    
)
4

1 回答 1

1

您正在尝试规范化星型模式。存在诱惑是因为您不想复制数据,但这是数据仓库的权衡。

如果你想这样做,最好的方法是“雪花”你的星形模式。您必须将事实表连接到地址维度,并使用标准的关系数据库样式从地址维度连接到地理信息表。您将需要地址维度中地理信息表的外键。

我会推荐一种替代方法:所有这些字段在单个维度表中会更好,以及任何其他联系方式/位置相关字段。这将在诸如“状态”之类的低基数字段上花费一些磁盘空间,但与事实表的大小相比,这应该可以忽略不计。

使用更少的表、更少的连接和更少的键,这种方法几乎总是更简单、更快。

于 2016-03-15T09:24:29.573 回答