0

我们目前正在研究数据集市设计。我们有许多维度表的外键。我们正在考虑是否允许NULL在外键维度字段中或使用-1来表示NULL值。

Kimball 建议保留值的默认行NULLhttp://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/Dimension-modeling-techniques/fact-table-null/

我的领导建议保持NULLNULL.

NULL保留外键字段会对性能产生影响吗?

4

2 回答 2

2

金博尔是对的(他通常是这样)。在您要使用的地方使用默认值NULL

为什么?它确保连接到维度不会“意外”过滤行。尝试协调来自不同查询的结果会占用大量时间。确保连接成功是减少此类差异的一种方法。

如果您不打算听从他的建议,请使用NULL. 诸如此类的值-1特别糟糕——因为它会阻止数据库强制执行外键约束。

于 2016-10-26T18:48:10.700 回答
1

另一个避免使用 Gordon 未涵盖的 NULL 的原因:不清楚 NULL 的含义。

有时,您在数据集市或数据仓库中有 NULL,因为 ETL 或源系统中出现问题,导致 NULL。其他时候你有一个 NULL 因为该列不适用于该特定行。或者在诸如累积快照表之类的情况下,因为该列尚未被填充,因为正在报告的进程尚未达到该列将被填充的点。

我喜欢设置多个而不是单个默认值;例如,您可以将每个维度设置为具有指示“未知”的行,您可以将其用于缺失值,并设置一个指示“N/A”的行,用于该值不适用的情况。我倾向于为键设置负整数(-1 是未知,-2 是 N/A 等),因为这允许我在每个表中对这些行使用相同的键。但正如 Kimball 和 Gordon 所指出的,您实际上应该在维度中创建这些行。

这使得运行数据质量检查以查找出现问题的情况变得非常容易。这意味着您可以在任何报告或分析工具中显示一些有意义的值,以便人们可以根据需要过滤掉尚未完全填充的行,或者您的数据管理员可以通过这些工具查找有问题的数据。或者,也许人们可能想要专门寻找其中一个维度不适用的那些行。

如果您遇到数据有时以“错误”顺序加载的情况(即填充了事实表,但尚未向相关维度成员添加维度),您还可以使用它来检查需要更新的行您的 ETL 并自动修复问题,而无需重复尝试更新那些不需要更新的行,因为它们将始终具有 NULL。

当其他人接管这个数据集市的支持时,他们会非常感激,因为他们不必花费大量时间来判断那些 NULL 或 -1 是否表示问题。

于 2016-10-28T11:07:09.450 回答