我了解 DWH 环境中代理键的一般概念。但是有两个方面我不明白,也找不到相关信息:
- 代理键在整个 DWH中是唯一的还是在一维中是唯一的,这是常见的做法吗?
- 如果我有一个带有层次结构的维度,该层次结构会影响代理键的生成吗?
我了解 DWH 环境中代理键的一般概念。但是有两个方面我不明白,也找不到相关信息:
1) 代理键对于一行是唯一的 - 它用作一行中所有单元格之间关系的通用句柄。由于数据的存储方式,代理键对于推断行中单元格之间的关系并不是绝对必要的。但是,如果您的行表示实体(表)中的可数标识(行),如果您的数据库是规范化的,那么引用一个代理键(通常是主键)比保持引用更容易主键中的所有参与者。例如,在一个紧凑列上维护索引比在整行上更容易。
事实上,代理键有另一个应用。由于数据通常来自多个来源,因此您很可能会遇到复合主键的问题(组合的几列用于唯一标识每一行),以及重复业务键的问题(从各个源系统)。因为代理键用于查找,所以它的紧凑性很重要。使用递增的整数或固定长度的哈希,并将来自源的业务密钥保存在单独的列中。
2)这个问题很难回答,因为我不知道你用什么软件来管理你的维度和层次结构。这对事情影响很大。在典型的非规范化 Kimball 架构中,在维度表中,代理键用于引用唯一行在维度表中。在具有多个层次结构的维度表中,其含义可能会有些混乱。代理键仅对于具有最高基数(成员数)的层次结构才是真正唯一的,因为它决定了维度表中有多少行。所以实践是维度表的键是唯一的,并且恰好是其中的一个层次结构 - 具有最多成员数的层次结构。如果您为此添加层次结构的版本控制(缓慢变化的维度),则代理键的确切含义可能具有欺骗性。
注意/咆哮:我通常发现一维表中的多个层次结构的想法非常令人震惊。确实,它减少了事实表中维度引用的数量,但也有缺点。维度表的非规范化(丑陋的重复)有几个后果。其中之一是在加入维度表时存在重复计算的风险。这通常由使用的软件包修复(或掩盖),检查值是否相同,然后对它们求和,如果是则减少计数。但这是计数异常和求和错误的常见来源,只能通过真正肮脏的黑客来处理。其中我见过不少。
是的,代理键对一行是唯一的 - 它用作一行中所有单元格之间关系的通用句柄。由于数据的存储方式,代理键对于推断行中单元格之间的关系并不是绝对必要的。但是,如果您的行表示实体(表)中的可数标识(行),如果您的数据库是规范化的,那么引用一个代理键(通常是主键)比保持引用更容易主键中的所有参与者。例如,在一个紧凑列上维护索引比在整行上更容易。