Как указано в предыдущем ответе, для значений Null может быть много разных значений для измерения, неизвестного, неприменимого, неизвестного и т. Д. Если в вашем приложении полезно различать их, добавляя «псевдо» записи измерения может помочь.
В любом случае я бы не использовал внешние ключи или поля измерений с нулевым фактом, поскольку даже одно «неизвестное» значение измерения поможет вашим пользователям определять запросы, включающие групповую группировку, где качество данных не равно 100%. (и никогда не бывает).
Один очень простой трюк, который я использовал для этого и еще не укусил меня, - это определить суррогатные ключи моих измерений, используя int IDENTITY (1,1) в T-sql (начиная с 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)
Я установил правило иметь по крайней мере одну такую псевдоряд на измерение, которое используется в случаях, когда поиск измерений не удается, и создавать отчеты об исключениях для отслеживания количества фактов, которые назначены таким строкам.