在ApacheHive的维度表中使用代理键或nk+有效时间更好吗

n3h0vuf2  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(352)

假设有一个scd2维度表-位置。自然的关键是国家、州和城市的结合。因为它是scd2表,所以eff date也是键的一部分。
最好使用usaviginarichmond20110101作为代理项键,还是在配置单元中使用行编号()创建一个实际的数字键?
为什么一种方法比另一种更好?

rekjcdws

rekjcdws1#

(术语说明:自然密钥的组合称为“复合密钥”,而不是代理密钥,它仍然是“自然密钥”。代理密钥(也称为合成密钥)是一个没有业务意义的连续整数。
简单回答:因为您的维度是scd2,所以一定要使用代理键/合成键。使用自然/复合键处理scd是一件痛苦的事情。
长答案:代理(sk)与自然密钥(nk)的设计是一个正在进行的辩论。各有利弊。我的方法是在数据仓库(dw)中始终使用代理密钥。这意味着一些额外的etl工作,但这是可以接受的成本,因为代理密钥有一些重要的优势:
scd处理更容易。如果你有scd,使用自然键是相当麻烦和丑陋的。合成键没有问题;
系统范围的一致性:由于scd,您很可能必须在数据仓库中至少在某些表中使用sks。因此,在所有表中一致地使用它们是有意义的。混合sk和nk设计是丑陋的;
复合NK通常可以是大而复杂的字母数字字符串。这意味着它们可能会大大增加表的大小,并且连接可能会更慢。sk是一个简单的整数,具有可预测的大小和一致的连接速度;
nks可能是dw中bug和不稳定性的来源。例如,一些数据库重复使用它们的自然键,因此它们的含义可能会随着时间的推移而改变。在依赖nks的dw中,这是一个潜在的灾难。此外,NK可能来自各种各样的来源,并导致集成冲突。
还有其他考虑,但以我的经验,系统地使用代理密钥可以使dw设计更加可靠和高效。

nuypyhwy

nuypyhwy2#

您可以按生效日期进行分区,以便只使用具有生效日期的分区进行更快的筛选/连接。什么样的代理密钥 usavirginarichmond20110101 会给你什么?完全扫描,因为筛选将在substr上。所以,继续 country, state, city and effective_date 分别作为密钥和分区 effective_date .
还有一个更重要的问题:在配置单元中使用row\u number()的数字键不是一个好的解决方案,因为它的生成不是在分布式模式下运行的。最好使用guid。

相关问题