我的数据源DimAddress和DimGeoInforamtion中有两个维度。如果我想从地址表中使用Hierarchy,我将从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)
)
答案 0 :(得分:1)
您正在尝试规范化星型模式。存在的诱惑是因为你想要不想复制数据,但这是数据仓库的权衡。
如果你想这样做,最好的方法是'雪花'你的星型模式。您必须将事实表连接到Address维度,并具有从地址维度到GeoInformation表的标准关系数据库样式连接。您需要在地址维度中为GeoInformation表提供外键。
我建议采用另一种方法:所有这些字段在单个维度表中以及任何其他联系人详细信息/位置相关字段中都会更好。这会在低基数字段(例如“状态”)上花费一些磁盘空间,但与事实表的大小相比,这应该可以忽略不计。
使用更少的表,更少的连接和更少的键,这种方法几乎总是更简单,更快。