Kimball是对的(他通常是这样)。使用您要使用的默认值 NULL 。
NULL
为什么?它确保连接到维度不会“意外”过滤行。尝试协调来自不同查询的结果会耗费大量时间。确保联接成功是减少这种差异的一种方法。
如果你不打算听从他的建议,那就存储使用 NULL 。像这样的价值 -1 特别糟糕 - 因为它阻止数据库强制执行外键约束。
-1
避免使用Gordon没有涉及的NULL的另一个原因是:它不清楚NULL意味着什么。
有时您在数据集市或数据仓库中有NULL,因为ETL或源系统中出现了问题,导致NULL。其他时候您有一个NULL,因为该列不适用于该特定行。或者在类似累积快照表的情况下,因为尚未填充该列,因为报告的进程尚未到达将填充该列的点。
我想设置多个而不是单个默认值;例如,您可以将每个维度设置为具有可用于缺失值的“未知”行,以及对于值不适用的情况指示“N / A”的行。我倾向于用键的负整数设置它们(-1是未知,-2是N / A等),因为这允许我在每个表中对这些行使用相同的键。但正如Kimball和Gordon所指出的那样,你应该在你的维度中创建那些行。
这使得运行数据质量检查非常容易,可以查找出现问题的情况。这意味着您可以在任何报告或分析工具中显示一些有意义的值,以便人们可以根据需要过滤掉尚未完全填充的行,或者您的数据管理员可以通过这些工具查找有问题的数据。或者也许人们可能想要专门查找其中一个维度不适用的行。
如果您遇到数据有时以“错误”顺序加载的情况(即事件表已填充,但相关维度成员尚未添加维度),您还可以使用此方法检查需要更新的行您的ETL并自动修复问题,而不会反复尝试更新那些不需要更新的行,因为它们始终具有NULL。
当其他人接管这个数据集市的支持时,当他们不必花费大量时间来取消这些NULL或-1s是否表示存在问题时,他们将非常感激。