数据仓库ETL工具箱——提交维表(二)

小维度和大维度

数据仓库中许多记录都是在小表中,表中记录很少,字段只有一两个。创建这些表时应当保留最初的源表,经常会有新的记录添加。小维度可能出现在很多数据集市中,因此经常把多个小维度合并成一个大的维表,从而简化设计。冗余维的ETL流如下图所示:

由于增量建立的冗余维在合并代码时可能比笛卡尔积小的多,因此冗余维的记录可以在整合数据时创建。

在维表模型中,经常假设各个维表之间是相互独立的。但是按严格的数据角度,经常合并维度,即使两个维度不属于同一个层系,但是从结果来看,两个维度的相关性足够强并且合并后的结果足够小,这两个维度也应该合并在一起。如果不满足上述条件,则两个维度就是相互独立的。

角色维度

在数据仓库中,相同的事实表被多次指定一个维度时,称为角色维度。最常见的维度是日期维度。在所有角色维度中,书中推荐建立一个统一的维表,然后基于此统一的维表建立不同的角色视图。若使用大维度表则应该在不同的子集中创建物理表,避免使用视图破坏性能。

退化维

在维表中出现父子关系,父维度的自然键是子维度的主键,并且子维度的主键可以创建一个单一列的维度,则称为退化维或者空维。

缓慢变化维

当数据仓库被告知一条已经存在的维度记录在某些方面发生了变化,会生成3种基本响应,这三种基本响应被称为装在1、2、3的缓慢变化维。

类型一缓慢变化维为覆盖,是对已经存在的维度记录的一个或多个属性进行复写。当数据被矫正而不需要保留历史记录或不需要执行以前的报表可以选择1SCD:

为了提高ETL的性能,应该将更新现有数据的过程和插入新数据的过程区分开,并分别向数据仓库回馈。在大多数数据仓库执行的过程中,大多数维度的大小是可以忽略的。如果装载小表不需要调用大量加载,类型一的变化可以通过标准的DML实现。

在ETL中第一类缓慢变化维有可能引起性能问题。如果通过SQL数据操作语言实现这种技术,大部分数据库管理系统会在日志中记录事件发生,损耗系统性能。数据库日志由数据库管理系统在后台创建和维护。对于数据进入转换处理用户无控制的情况下,数据库日志显得尤为重要。在线交易处理情况下,无法对用户的行为进行控制,而数据库日志可以记录回滚、撤销或更新失败的操作。相反的,数据仓库中,所有的数据装载都由ETL处理控制。如果处理失败,那么ETL应该有能力从错误中恢复和标记中断。激活数据库日志会使大维度表装在效率下降。一些数据库管理系统可以允许在某些数据操作语言处理开始的时候关闭日志,而且当触发批量导入器的时候也要关闭数据库日志。如果是大量的第一种类型维度转换,减小数据库管理系统负担的一个最好的方法是使用批量装载器。在单独表中准备新的维度记录。从维度表中删除记录并重新批量加载。

类型二的缓慢变化维是在维度实体中追踪变化,并正确关联到事实表的标准基本技术。基本原理是:当数据仓库被告知一条现有的维度记录要更改而不是重写的时候,数据仓库会在变化时发布一条新的维度。新的维度记录还会分配一个新的代理主键。在此之前,所有的有维度的事实表中,代理主键被用作外键。只要在发生改变的时刻,代理键分配的得当,那么不会有任何一个已有的事实表中的键值需要改变或跟新,已有的聚合事实表也不需要重新计算。

由于维度实体的每个细节版本都正确连接到事实表记录,因此第二种缓慢变化维度完美的区分了历史表。书中给的例子如下图:

 

上图是一名叫Jane Doe的员工维度记录。他最开始是实习生,然后转为正式员工,最后成为管理人员。Jane Doe的自然键是他的员工编码,这是他工作期间一直保持不变的编码。

如果一个维度的自然键可以变化,从数据仓库的观点上,它不是真正含义上的自然键。因此,数据仓库要求使用更加符合基本原理的代理键。

第二种缓慢变化维度需要在ETL环境中有一个良好的变化数据捕获系统,一旦元数据发生变化就要探测到,这样数据仓库就会生成新的维度记录。对维表代理键的管理如下图:

 

一般ETL系统会为维度的每一个列保留一个策略,这个策略决定了当变化发生时,应触发哪种变化类型。书中推荐在维度表中增加以下5个字段来处理类型2的逻辑:

  • 日历日期外键(变化日期)
  • 行有效时间日期(变化的精确时间日期)
  • 行结束时间日期(下一个变化的时间日期)
  • 变化理由(正文字段)
  • 当前标志(当前/期满)

这五个字段可以让维度支持强大的查询甚至在查询里不需要事实表。当维度实体发生替代变化的时候,要把标志设为终止(expired)

当维度记录发生变化,但属性原来的值仍保持有效性的时候,要使用第三种缓慢变化维度。在第三种缓慢变化维度中,当变化发生的时候,生成新的一列而不是新的一行。在新的主值复写之前,原来的值就被放置在这一列中。

在常规的数据流传递途径上,第三种方式不经常出现,这种方式的管理以手工的方式开始,如果变更的属性没有交替字段的话,甚至可以包括结构计划的更改。

响应属于第三种SCD类型的维度属性变化的结果是基于字段到字段的。在一个维度中通常可以包括第一种类型和第二种。当第一种类型字段发生变化,字段中的值被复写。第二种类型变化,就生成一个新记录。也有可能在一条维度记录中混合三种不同的变化类型:

 

滞后到达的数据在数据仓库中呈现出一种复杂的状态,需要通过不同的方法抽取或与常规数据不同的结束,劣质数据在数据清洗阶段就要筛选出来。

更新事实表记录要在测试环境中心小心处理,然后才可以实施到生产系统中。若数据库系统对更新操作有保护措施的话,要注意更新不会设计到海量数据。从操作的目的上看,大量的更新会被分为不同的块,没有必要把时间浪费在百万记录更新失败的回滚上。

为了避免桥接表和事实表的多对多连接,必须创建一组实体关联到海量值维度。在许多情况下,都是需要桥接表,但是没有合理分配加权系数的基准。如果海量值维度是第二种缓慢变化维度,桥接表必须是随时间变化的。

不规则层次的不可测深度在数据仓库中是重点。书中介绍了两种维度方法,递归指针方法和层次桥接表方法,分别如下图:

 

 

对于关系型数据库用SQL语句存储一些严格约束的分析类型的接口,需要展现在维度记录上的复杂对比。以上为提交维表的相关内容,由于对内容的理解比较生僻,所以好多地方只能抄书,估计再多学习以下这方面的只是应该就可以理解了。下篇我们将介绍提交事实表的相关内容。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值