代理键的用途
代理键是不具有业务含义的键,在维度建模领域里,通常代替自然键作为维度表的主键。代理键用于维度表和事实表的连接。
使用代理键有以下这些优势
- 整合不同业务系统的数据时,可能存在自然键重复的问题,使用代理键可以解决这个问题
- 使用代理键可以处理缓慢变化维(Type 2 SCD),维护历史信息记录。使用Type 2 SCD时,通常会增加一行来记录数据的变化,如果还是沿用原先的自然键,则与事实表关联的时候会出错,这个时候就需要用代理键来处理。代理键作为维度表的主键,用来在数据仓库内部中的维度表和事实表建立关联。
- 使用代理键可以提升性能。和自然键相比,代理键占用的存储空间小,是整型的,可以减小事实表中记录的长度。这样,同样的IO就可以读取更多的事实表记录。另外,整型字段作为外键连接的效率也很高
- 使用代理键可以处理一些特殊情况。举个例子,对于商店来说某些顾客是未知的,在顾客的维度表中需要增加一条未知的记录来避免在事实表中出现空的顾客表外键。
代理键的实现
- 数据库的自增字段,基本理念是在数据库服务器中维护一个计数器,将当前值写入一个隐藏的系统表来维护一致性,并用于赋值一个新建的数据行。每创建一行,计数器递增并将值作为该行的键值
- MAX(key)+1,第一条记录从1开始,然后新行的值设置为该列的最大值加1,最大值用SQL函数MAX获得,对于大表存在性能问题
- 全局唯一标识符(GUIDs),一种由算法生成的二进制长度为128位的数字标识符,确保在机器内部唯一
在数据仓库中应当避免使用GUID作为代理键。原因是GUID存储空间占用大,且作为索引效率低。