数仓模型设计时代理键的使用

在关系型数据库设计中,代理键是在当资料表中的候选键都不适合当主键时,例如资料太长,或是意义层面太多,就会用一个attribute来当代理主键,此主键可能是用流水号,来代替可辨识唯一值的主键。

在数据仓库领域有一个概念叫Surrogate key,中文一般翻译为“代理关键字”。代理关键字一般是指维度表中使用顺序分配的整数值作为主键,也称为“代理键”。代理关键字用于维度表和事实表的连接。在Kimball的维度建模领域里,是强烈推荐使用代理关键字的。在维度表和事实表的每一个联接中都应该使用代理关键字,而不应该使用自然关键字或者智能关键字(Smart Keys)。数据仓库中的主键不应该是智能的,也就是说,要避免通过主键的值就可以了解一些业务信息。

使用代理关键字的优点:

1.使用代理关键字能够使数据仓库环境对操作型环境的变化进行缓冲。也就是说,当数据仓库需要对来自多个操作型系统的数据进行整合时,这些系统中的数据有可能缺乏一致的关键字编码,即有可能出现重复,这时代理关键字可以解决这个问题。

2.使用代理关键字可以带来性能上的优势。和自然关键字相比,代理关键字很小,是整型的,可以减小事实表中记录的长度。这样,同样的IO就可以读取更多的事实表记录。另外,整型字段作为外键连接的效率也很高。

3.使用代理关键字可以建立一些不存在的维度记录,例如“不在促销之列”,“日期待定”,“日期不可用”等维度记录。

4.使用代理关键字可以用来处理缓慢变化维。维度表数据的历史变化信息的保存是数据仓库设计的实施中非常重要的一部分。Kimball的缓慢变化维处理策略的核心就是使用代理关键字。

不足:使用代理关键字也有它的缺点,代理关键字的使用使数据加载变得非常复杂。

PS:

维度表中的主键通常有两种选择:​

自然键(NaturalKey),它是业务系统中已经存在的,通常是具有一定业务含义的一个字符型的标志符,可以唯一地标志维度表中的每一条记录。比如机构的代码、缩写、时间标签等。

另一种是代理键(SurrogateKey),通常是数据库系统赋予的一个数值,是自增型的,按顺序分配,没有内置含义但也可以唯一地标识一条维度信息。​

项目经验,推荐采用第二种,即代理键。原因如下:​

首先,自然键虽然在逻辑上可以唯一地标识出一条维度信息,但它通常是字符型的,且一般比较长,若用它作为维度表中的主键,那就意味着在事实表中也要加入同样的外键信息,而事实表记录行数往往是巨大的,在多个维度表上重复这样的做法会使事实表由于列宽过于膨胀而导致性能的急剧下降。​

其次,代理键可以作为数据仓库与源系统之间的“缓冲”。自然键通常具有一定的业务含义,但日久天长,这些信息是有可能发生变化的,比如身份证号码,由最初的15位变成了现在的18位。如果这种主键一旦发生了变化,由于它同时作为事实表中的外键,必然会对事实表产生影响,因为已有的事实记录已经找不到与之匹配的维度记录,这就带来了很大的麻烦。但若采用代理键作为维度表中的主键,就完全可以把这些变化屏蔽在维度表内,不会对事实表产生任何影响(当然这个还要结合缓慢变化维度的处理)。​

最后,从关连效率考虑,数值型的关联要比字符型的关联快很多。

在设计关系数据库主键时,简单划分有以下两种方法:

1.使用原业务中的主键作关系表的主键

2.新建无意义的主键列,原业务的主键作为关系表的一个属性

起一种称为业务键(business key),这样导致更新主键列非常困难,给业务扩展带来障碍。
第二种称为代理键(surrogate key),对用户没有意义,不呈现给用户,而只用作软件系统内部的数据标识。

代理键的选择方式也体现了关系数据库设计和业务的解耦,用作关系数据表联系的代理键不妨碍业务的扩展。

现在的理解,代理键的使用场景主要是在维表上,也即范式模型的代码整理这一块。至于事实表的代理键,使用场景一般较少。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值