正如前面的答案所述,一个维度的 Null 值可能有许多不同的含义,未知、不适用、未知等。如果能够在应用程序中区分它们是有用的,则添加“伪”维度条目会有所帮助。
在任何情况下,我都会避免使用 Null 事实外键或维度字段,即使只有一个“未知”维度值也将帮助您的用户定义包含数据质量不是 100% 的包罗万象分组的查询(而且它从来不是)。
我一直在使用的一个非常简单的技巧是使用 T-sql 中的 int IDENTITY(1,1) 定义我的维度代理键(从 1 开始,每行增加 1)。伪键(“不可用”、“未分配”、“不适用”)被定义为负整数,并由在 ETL 过程开始时运行的存储过程填充。
例如一个表创建为
CREATE TABLE [dbo].[Location]
(
[LocationSK] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Abbreviation] [varchar](4) NOT NULL,
[LocationBK] [int] NOT NULL,
[EffectiveFromDate] [datetime] NOT NULL,
[EffectiveToDate] [datetime] NULL,
[Type1Checksum] [int] NOT NULL,
[Type2Checksum] [int] NOT NULL,
) ON [PRIMARY]
和一个存储过程填充表
Insert Into dbo.Location (LocationSK, Name, Abbreviation, LocationBK,
EffectiveFromDate, Type1Checksum, Type2Checksum)
Values (-1, 'Unknown location', 'Unk', -1, '1900-01-01', 0,0)
我已经制定了一个规则,即每个维度至少有一个这样的伪行,用于在维度查找失败的情况下,并构建异常报告来跟踪分配给这些行的事实数量。