自然键和代理建的区别

概念解释

  • 键:键是唯一标识一个实体的一个或者多个数据属性。在物理数据库中,建可以由变的一个或者多个列组成,它们的值唯一标识关系表中的一行

  • 自然键:由现实时间中已经存在的数据组织成的键, 字段本身具有一定的含义;例如,身份证号、员工编号等

  • 代理键: 就是充当主键的字段本身不具有业务意义,只具有主键作用,比如自动增长的ID

比如商品,在ETL过程中,对于商品维表的每一行,可以生成一个唯一的代理键与之对应; 商品本身的自然键可能是商品ID等。其实对于前台应用系统来说,商 ID是代理键:而对于数据仓库系统来说,商品 ID 则属于自然键。

代理键优缺点

优点

  • 使用代理键能够使数据仓库环境对操作型环境的变化进行缓冲。也就是说,当数据仓库需要对来自多个操作型系统的数据进行整合时,这些系统中的数据有可能缺乏一致的关键字编码,即有可能出现重复,这时代理关键字可以解决这个问题。
  • 使用代理键可以带来性能上的优势。和自然关键字相比,代理关键字很小,是整型的,可以减小事实表中记录的长度。这样,同样的IO就可以读取更多的事实表记录。另外,整型字段作为外键连接的效率也很高。
  • 使用代理键可以建立一些不存在的维度记录,例如“不在促销之列”,“日期待定”,“日期不可用”等维度记录。
  • 使用代理键可以用来处理缓慢变化维。维度表数据的历史变化信息的保存是数据仓库设计的实施中非常重要的一部分。Kimball的缓慢变化维处理策略的核心就是使用代理键。

缺点

  • 对于每个 表 的记录生成稳定的全局唯 一 的代理键难度很大,此处稳定指某条记 录每一 次生 成的代理键都相同
  • 第 二个原因是,使用代理键会大大增加 ETL 的复杂性,对 ETL 任务的开发和维护成本很 高。

选择

在阿里《阿里巴巴大数据实践 》中,阿里数仓建设使用的是自然键,虽然在kimball维度建模中,使用代理键作为每个维表的主键,用于处理缓慢变 化维;但是个人也是倾向于使用自然键;主要有一下几个方面的理由:

  • 生成代理键难度很大,大大增加ETL人物的开发和维护成本
  • 对于缓慢变化维的处理,也是建议使用快照表的方式,虽然相比拉链表,要多使用一些空间,但是维度表数据量不会太大。而且开发和维护成本低,操作也简单,对于投入到数仓开发的新手,理解性也好
  • 实际的开发中,也很少会遇到对来自多个操作型系统的数据整合,强行使用代理键,投入产出并不高;在遇到多操作系统数据整合的场景,可具体问题具体分析,可再考虑使用代理键的方式

参考: