可以说,这里有一个SCD2尺寸表-位置。自然键是国家,州和城市的组合。由于它是SCD2表,因此生效日期也是键的一部分。
将替代键设置为usavirginarichmond20110101还是在蜂巢中使用row_number()创建实际的数字键更好?
为什么一种方法优于另一种方法?
答案 0 :(得分:0)
您可以按有效日期进行分区,以便更快地过滤/仅对具有有效日期的分区进行联接。
像这样的usavirginarichmond20110101
代理键会给您什么?完全扫描,因为过滤将在substr上进行。因此,将country, state, city and effective_date
分别保留为键,并用effective_date
进行分区。
还有一个要点:在蜂巢中使用row_number()的数字键不是一个好的解决方案,因为它的生成不在分布式模式下运行。为此,最好使用GUID。
答案 1 :(得分:0)
(术语注释:自然键的组合称为“复合键”,而不是替代键,它仍然是“自然键”。替代键(即合成键)是无业务意义的连续整数)。
简短的回答:由于您的尺寸为SCD2,因此请务必使用代理/合成键。使用自然/复合键处理SCD是很痛苦的。
更长的答案: 代理(SK)与自然键(NK)设计是一个持续不断的争论。每个都有优点和缺点。我的方法是始终使用数据仓库(DW)中的代理密钥。这意味着需要做一些额外的ETL工作,但这是可以接受的费用,因为代理键具有一些重要的优点:
SCD处理要容易得多。如果您有SCD,则使用自然键相当麻烦且难看。合成键没有问题;
系统范围内的一致性:由于SCD,极有可能至少在某些表中必须在数据仓库中使用SK。然后在所有表中始终使用它们是有意义的。混合SK和NK设计很丑陋;
复合NK通常可以是大而复杂的字母数字字符串。这意味着它们可能会大大增加表的大小,而连接可能会变慢。 SK是一个简单的整数,具有可预测的大小和一致的连接速度;
NK可能是DW中的错误和不稳定的来源。例如,某些数据库重复使用其自然键,结果其含义可能会随时间而改变。在依赖NK的DW中,这是潜在的灾难。此外,NK可能来自各种各样的来源,并导致集成冲突。
还有其他考虑因素,但是以我的经验,系统地使用代理密钥使DW设计更加可靠和高效。