我们目前正致力于数据集市设计。我们在维度表中有许多外键。我们正在考虑是否在外键维度字段中允许NULL
或者使用 -1 来表示NULL
值。
Kimball建议保留NULL
值的默认行。 http://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/dimensional-modeling-techniques/fact-table-null/
我的主管建议将NULL
保留为NULL
。
在外键字段中保留 Dim Teriffyskill As Byte()
是否会对性能产生影响?
答案 0 :(得分:2)
Kimball是对的(他通常是这样)。使用默认值,您可以使用NULL
。
为什么呢?它确保连接到尺寸不会意外地"过滤行。尝试协调来自不同查询的结果会耗费大量时间。确保联接成功是减少这种差异的一种方法。
如果您不遵循他的建议,请使用NULL
进行存储。诸如-1
之类的值特别糟糕 - 因为它会阻止数据库强制执行外键约束。
答案 1 :(得分:1)
避免使用NULL的另一个原因是Gordon没有涵盖:它不清楚NULL意味着什么。
有时您在数据集市或数据仓库中有NULL,因为ETL或源系统中出现了错误,导致NULL。其他时候你有一个NULL,因为该列不适用于该特定行。或者在累积快照表之类的情况下,因为尚未填充该列,因为报告的进程尚未到达将填充该列的位置。
我喜欢设置多个而不是单个默认值;例如,您可以将每个维度设置为具有指示"未知"的行。你可能用于缺失值,以及一行表示" N / A"对于不适用该值的情况。我倾向于用键的负整数设置它们(-1是未知,-2是N / A等),因为这允许我在每个表中对这些行使用相同的键。但正如Kimball和Gordon所指出的那样,你应该在你的维度中创建那些行。
这使得运行数据质量检查非常容易,可以查找出现问题的情况。这意味着您可以在任何报告或分析工具中显示一些有意义的值,以便人们可以过滤掉尚未完全填充的行,或者您的数据管理员可以通过这些工具查找有问题的数据。或者也许人们可能想要专门寻找其中一个维度不适用的行。
如果您遇到数据有时会加载错误"订单(即事实表已填充,但相关的维度成员尚未添加维度),您还可以使用它来检查需要在ETL中更新的行并自动修复问题,而无需反复尝试更新那些不需要更新的行,因为它们总是有NULL。
当其他人接管这个数据集市的支持时,他们会非常感激,因为他们不必花费大量时间来取消这些NULL或-1是否表示问题