2016-07-21 72 views
0

我在阅读关于DW建模的知识,并开始想知道为什么使用代理键?为什么需要代理键?

据我所知,有时候商业密钥并不是整数,这使生活(以及寻找和索引)变得更困难。 但是,我不明白为什么要通过添加和额外的列来管理唯一标识符来解决DW或RDBMS的有限局限性?

这种功能对于DW/RDBMS用户来说是否透明并且该条目会自动从系统获取内部标识符会更合适吗?例如,创建整行或其子集(可以某种文本格式表示的那些字段)的SHA-1摘要。

+0

代理键通常是自动递增的整数,长度为32位。由于您必须在适用的情况下将行标识符作为外键复制,因此通常会在复制长字符串或多列时节省大量空间。 – apokryfos

+0

了解。我没有得到的是为什么DW用户不得不担心这个问题,为什么它不是DW或RDBMS软件的集成功能? – aviad

+0

我的猜测是RDBMS不希望在没有必要的情况下强加替代键所占用的额外空间。 RDBMS提供的是DB开发人员在需要时定义此类密钥的机制。 – apokryfos

回答

1

使用代理键的原因是因为您可以控制数据仓库,但很有可能无法控制源系统。您今天对自然键的稳定性的假设可能会在未来导致您的问题。你可能会碰到

问题通过不使用自己的代理键:

  1. 大型或复杂的天然关键 - 正如你已经提到的,源系统可以使用自然键,不会执行以及一个简单的整数
  2. 自然键可以在源码中重复使用 - 我遇到了一个问题,一旦源系统从1开始回收密钥,一旦达到最大整数值就可以了(对于这是有道理的)。数据仓库必须认识到重复密钥是全新的记录。
  3. 合并 - 想象两家公司合并在一起。每个公司都有一个Employee表,其中有一个用作键的自动递增整数。每家公司都会有一名员工#1。 DW仓库需要代理键来区分共享相同ID的两个人。
+0

好点!然而,您所有的观点都与我(部分)提到的有关:不要假设源系统中使用的密钥,并在DB SW级别维护唯一标识符。难道这不是正确的方式来处理这个问题,而是在每一次渎职时间重新发明轮子? – aviad

+0

是的,不要假定源系统中的密钥,并且在数据库级别维护唯一标识符,最有可能使用自动递增整数字段。我不确定你的意思是“每一次重新发明轮子”。 – Cory

+0

重新发明轮子=让DB用户将唯一ID实施到记录中,而不是在DB软件中将其标准化。 – aviad