34个ETL系统总结 P10 代理键生成系统

10. 代理键生成系统

  • 自然键:自然键是已经存在的一个或多个属性,它在业务概念中是唯一的。
  • 代理键:引入一个不具有业务含义的列作为键。

引入代理键增加了业务的复杂行,减少键与业务的耦合程度。目前比较流行的做法是不引入代理键增加复杂性,在业务抽象过程中存在巨大优势的时候再进行代理键的引入。

实现代理键有几个常用的选择:

  • 使用数据库赋值。大多数主要的数据库供应商–例如Oracle、Sybase以及Informix–实现了被称为递增键的代理键策略。基本理念是在数据库服务器中维护一个计数器,将当前值写入一个隐藏的系统表来维护一致性,并用于赋值一个新建的数据行。每创建一行,计数器递增并将值作为该行的键值。不同供应商的实现策略不同,有时候值在所有表之间都是唯一的,有时候只在单个表内部是唯一的,但是基本概念相同。
  • MAX() + 1。一个常用的策略是使用整数列,第一条记录从1开始,然后新行的值设置为该列的最大值加1,最大值用SQL函数MAX获得。虽然这个方法简单,但是对于大表存在性能问题,而且它只能确保表内部的唯一键值。
  • 全局唯一标识符(UUIDs)。GUIDs是128位值,来自以太网卡ID或等价的软件表示以及系统当前时间的哈希值。该算法是由开放软件基金会定义的。
  • 全球唯一标识(GUIDs)。GUIDs是微软扩展UUIDs后的标准,遵从相同的策略,如果存在以太网卡使用网卡ID,如果不存在,使用软件ID与当前时间计算一个哈希值,确保在机器内部唯一。
  • 高低位策略。它的基本思想是键值,通常称为持久化对象标识符(POID)或者简称对象标识符(OID),分为两个逻辑部分:从指定来源获取的唯一HIGH值和应用自身分配的N为LOW值。每获取一个HIGH值,LOW值设置为0。例如,应用请求一个HIGH值并被赋予1701。假设LOW值的位数N为4,那么赋予对象的POID将会由17010000、17010001、17010002等等直到17019999组成。此时,再获取一个新的HIGH值,LOW值设置为0,再次重复。如果另一个应用在之后立即请求了一个HIGH值,它将获得1702,而它创建的对象被赋予OIDs将会是17020000、17020001等等。正如你所看到的,只要HIGH值唯一,所有的POID值将会唯一。在www.theserverside.com上可以找到一个HIGH-LOW发生器的实现。

猜你喜欢

转载自blog.csdn.net/hardyer/article/details/108713869