维(Dimension)和立方(Cube)

    博客之前的两篇文章:数据仓库的多维模型数据立方体与OLAP中分别对多维模型和OLAP的一些基本概念进行了介绍,这篇文章是基于那两篇文章的深入扩展,主要介绍的是多维OLAP中两个重要构成元素——维和立方的结构和组成。可能内容会偏向于模型构建方面,对那方面不太感兴趣的同学可以直接跳过。 ;-)

维(Dimension)

  维是用于从不同角度描述事物特征的,一般维都会有多层(Level),每个Level都会包含一些共有的或特有的属性(Attribute),可以用下图来展示下维的结构和组成:

Dimension

  以时间维为例,时间维一般会包含年、季、月、日这几个Level,每个Level一般都会有ID、NAME、DESCRIPTION这几个公共属性,这几个公共属性不仅适用于时间维,也同样表现在其它各种不同类型的维。其中ID一般被视为代理主键(Agent),它只被用于作为唯一性标志,并且是多维模型中关联关系的代理者,在业务层面并不具有任何意义;NAME一般是业务主键(Business),在业务层面限制唯一性,一般作为数据装载(Load)时的关联键;而DESCRIPTION则记录了详细描述信息,在多维展示和分析时我们都会选择使用DESCRIPTION来表述具体含义。这3个属性一般是所有Level都会共用的,而比如用于描述星期几的属性weekid可能只会用于“日期”这层,因为年月都不具备这一信息。所以图中我将Attributes放到了一个层面上,就如同是不同的Level从底层的多个Attributes中选取自身所需的属性,Attributes层是包含着各个Level的共有和特有属性的集合。

Hierarchy

  因为不知道怎么翻译好,所以还是用英文吧。Hierarchy(等级、层级的意思),中文的OLAP相关文档中普遍翻译为“层次”,而上面的Level被普遍翻译为“级别”,我经常会被这样的翻译搞混淆,所以我上面也一直用Level,至少对我来说这样看起来反而清晰点 :)

  因为上面这个结构的维是无法直接应用于OLAP的,我前面的文章有介绍,其实OLAP需要基于有层级的自上而下的钻取,或者自下而上地聚合。所以每一个维必须有Hierarchy,至少有一个默认的,当然可以有多个,见下图:

Hierarchy

  有了Hierarchy,维里面的Level就有了自上而下的树形结构关系,也就是上层的每一个成员(Member)都会包含下层的0个或多个成员,也就是树的分支节点。这里需要注意的是每个Hierarchy树的根节点一般都设置成所有成员的汇总(Total),当该维未被OLAP中使用时,默认显示的就是该维上的汇总节点,也就是该维所有数据的聚合(或者说该维未被用于细分)。Hierarchy中的每一层都会包含若干个成员(Member),还是以时间维,假设我们建的是2006-2015这样一个时间跨度的时间维,那么最高层节点仅有一个Total的成员,包含了所有这10年的时间,而年的那层Level中包含2006、2007…2015这10个成员,每一年又包含了4个季度成员,每个季度包含3个月份成员……这样似乎顺理成章多了,我们就可以基于Hierarchy做一些OLAP操作了。

  每个Hierarchy都包含了一个树形结构,但维中也可以包含多个Hierarchy,正如上图所示,维中的Hierarchy相互独立地构建了自己的树形结构。还是以时间维为例,时间维可以根据日历(Calendar)时间组建日历的Hierarchy,也可以根据财务(Fiscal)时间组建财务的Hierarchy,而其中财务季度的划分可能并不与日历一致,基于这种多样的Hierarchy,我们在组建多维模型时可以按需选择合适的,比如给财务部的数据分析模型选用财务Hierarchy,而其他部门的分析人员显然希望看到日历样式的Hierarchy,这样就完美地满足了不同的需求。多种的Hierarchy划分同样适用于产品维,根据产品类型、产品规格等划分 Hierarchy,对于按多种条件的产品筛选和检索是十分有效的,实例可以参见淘宝搜索商品界面和太平洋电脑中产品报价界面分类筛选模块,这里不再截图了。

立方(Cube)

  这里所说的立方其实就是多维模型中间的事实表(Fact Table),它会引用所有相关维的维主键作为自身的联合主键,加上度量(Measure)计算度量(Calculated Measure)就组成了立方的结构:

Cube

  度量是用于描述事件的数字尺度,比如网站的浏览量(Pageviews)、访问量(Visits),再如电子商务的订单量、销售额等。度量是实际储存于物理表中的,而计算度量则没有,计算度量是通过度量计算得到的,比如同比(如去年同期的月利润)、环比(如上个月的利润)、利率(如环比利润增长率)、份额(如该月中某类产品利润所占比例)、累计(如从年初到当前的累加利润)、移动平均(如最近7天的平均利润额)等,这些计算度量在Oracle中都可以借助分析函数直接计算得到,相信大部分的OLAP组件都会提供类似在时间序列上的分析功能。而这些计算度量往往对于分析而言更具意义,立方中借助与各个维的关联关系从不同的角度和层面来展现这些度量。

  The end,因为最近在看相关方面的资料,这篇文章就作为读书笔记,如果有哪里表述不准确的,还望指正。

维(Dimension)和立方(Cube)》上有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>