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