最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

谈笑间学会数仓—维度表概念及设计案例

[复制链接]
跳转到指定楼层
楼主
发表于 2021-10-29 20:20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
维度表维度定义
从某个角度观察事实数据的窗口,存储的数据用来从某个角度描述事实。维度表可以看成是用户用来分析一个事实的窗口,它里面的数据应该是对事实的各个方面描述,比如时间维度表,它里面的数据就是一些日,周,月,季,年,日期等数据,维度表只能是事实表的一个分析角度。换句话说 维度表可以看作是用户来分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。
维度的构成
维度的元素:维度的取值,即维度中的各个数据元素的取值。例如,地区维度中具体的成员有英国、法国、德国。
在设计过程中,来自数据源的数值数据字段到底是一个已度量的事实还是一个维度的属性是比较容易混淆的一个问题。一般情况下,在每次抽样时,如果数值数据字段的度量都改变,那么它就是事实,如果它是某种东西的离散值描述,并几乎保持为常数,那么它就是维属性。
维度的操作
1、钻取:通过变换维度的层次,改变粒度的大小。它包括上钻取(Drill up)和向下钻取(Drill down)。向上钻取是将细节数据向上追溯到最高层次的汇总数据。向下钻取是将高层次的汇总数据深入到低层的细节数据中。
2、旋转:通过变换维度的方向,重新安排维的位置,例如行列转换。
3、切片和切块:在一个或者多个维度上选取固定的值,分析其他维度上的度量数据。如果其他维度剩余两个,则是切片;如果是3个则是切块。
维度的分类
维度主要有4种类型,包括结构维、信息维、分区维和分类维。结构维最为普通,它包含具有层次结构的成员;信息维包含需要计算的属性;分区维用于信息的比较,如计划销售情况和实际销售情况;分类维用于根据维的属性来分组。此外,还有一些结构上比较特殊的维,如退化维和垃圾维等。
结构维
结构维表示在层次结构组成中的信息量度。下面是一些普通的结构维
  • 客户地理位置维
    • 这个维可提供一个根据客户所在地进行归类的层次结构。客户维的典型例子是“customer_city”、“customer_state”和“custmer_country”。这个维通常用于查看不同的地理位置在销售、利润和其他客户度量方面的不同。
  • 时间维
    • 可表明事件发生的时间。典型的时间维应该是年、月和日。
  • 销售人员地理位置维
    • 这个维可提供一个根据销售人员所在地域进行归类的层次结构。这个维通常用来查看工作在不同地域的销售人员的销售情况和利润等。
  • 产品维
    • 出售的产品。这个层次结构可能包括“product_name”、“product_brand”、“product_category”和“product_department”。这个维用来查看不同类别的产品的销售利润和其他指标。
    所有这些结构维都包含他们所在层次结构的属性。在结构维中层次是非常重要的,所以要在下面分别进行讨论。

信息维
信息维是计算字段建立的。用户也许想通过销售利润了解所有产品的销售总额。也许希望通过增加销售来获得丰厚的利润。然而,如果某一款商品降价销售,可能会发现销售量虽然很大,而利润却很小或几乎没有利润。从另一方面看,用户可能希望通过提高某种产品的价格获得较大利润。这种产品可能具有较高的利润空间,但销量却可能很低。因此,就利润建立一个维,就销售总量建立一个度量可以提供有用的产品信息。
用户可以对利润进行计算:销售价格减去销售人员的开销。知道了每种商品的平均利润之后,还可以用它乘以每一天的销售量从而得到每种商品每一天的总利润。真实世界在实际应用中,也许需要进行很多项这样的计算,因为每一天的销售价格和开销都有很大差异。因此,需要一个包含每天的销售价格和每天开销情况的表。在用户查看的时间段上,每一天的销售价格和每天的开销情况都是有区别的,需要进行合计并求平均。某一天每种商品的利润乘以这一天的销售量等于当天的总利润,选定时间段的利润总和为各天的利润之和。创建了一个包括每种商品利润和全部利润的维,就有了一个信息维。
分区维
生成信息表以同一结构生成两个或多个维时,要用到分区维。
例如,用户可能要创建用于预测销售额和实际销售额的两个维。这两个维的结构相同,只是数值不同。另一个例子是时间维,每一年有相同的季度,相同的月和相同的天(除了闰年以外,而它不影响维)。在OLAP Services中,将频繁使用时间分区维来分割数据仓库中的数据。
例如:为下列结构生成两个同样的维。
the_day
the_month
the_year
一个时间维中的数据是针对1998年的,而另一个时间维中的数据针对1999年的。建立事实表时,可以把度量分割为1998年的数据和1999年的数据,这将带来许多益处。
分类维
分类维是通过对一个维的属性值分组而创建的。如果客户表中有家庭收入属性,那么,可能希望查看客户根据收入的购物方式。为此,可以生成一个含有家庭收入的分类维。
例如:如果有以下家庭每年收入的数据分组:020000元、2000140000元、4000160000元、60001100000元和大于100001元。现在就可以考虑如何度量,例如,从这些分类中的每一个所购买产品的数量上来看他们的收入水平怎样和购买量怎样。另外一个可能的分类是家庭成员的性别和数量。
特殊维类型
特殊的维主要是在结构上区别于常见的维度,主要有退化维、垃圾维、一致维和父子维。
退化维
当维表中的主键在事实表中没有与外键关联时,这样的维称为退化维,退化维的定义是Ralph Kimball提出来的。一般来说事实表中的外键都对应一个维表,维的信息主要存放在维表中;但是退化维仅仅是事实表中的一列,这个维的相关信息都在这一 列中,没有维表与之相关联。退化维与事实表并无关系,但用于一般在企业事件中跨越维之间查询数据时,作为约束,也就是查询限制条件(比如订单号码、出货单编号等),就是常用退化维。以销售分析而言,通常是把出货日期作为事实的时间,而把订单日期或需求日期等作为查询条件,这里,订单日期或需求日期就是退化维。
退化维的作用
1、退化维具有普通维的各种操作,比如:上卷,切片,切块等。
2、如果存在退化维,那么在ETL的过程将会变得容易。
3、它可以让group by等操作变得更快。
垃圾维
针对某企业事件,通常提供了必要的查询值,但是却没有直接映射信息对象产生的维表,这样的字段就是垃圾维。一般来说,如果OLAP系统包含杂乱的标识和文字属性,而且与时间维以外的维表没有关系,就可以使用垃圾维。唯一要注意的是,垃圾维必须是对企业决策潜在限制值非常重要的属性,通常会创建一个维表来存储这些属性。
一致维
在多维体系结构中,没有物理上的数据仓库,由物理上的数据集市组合成逻辑上的数据仓库。而且数据集市的建立是可以逐步完成的,最终组合在一起,成为一个数据仓库。 如果分步建立数据集市的过程出现了问题,数据集市就会变成孤立的集市,不能组合成数据仓库,而一致性维度的提出正式为了解决这个问题。
当有好几个数据集市要合并成一个企业级的数据仓库时,可以使用一致维来集成数据集市以便确定所有的数据集市可以使用每个数据集市的事实。所以,一致维常用于属于企业级的综合性数据仓库,使得数据可以跨越不同的模式来查询。
在同一个集市内,一致性维度的意思是两个维度如果有关系,要么就是完全一样的,要么就是一个维度在数学意义上是另一个维度的子集。例如,如果建立月维度话,月维度的各种描述必须与日期维度中的完全一致,最常用的做法就是在日期维度上建立视图生成月维度。这样月维度就可以是日期维度的子集,在后续钻取等操作时可以保持一致。如果维度表中的数据量较大,出于效率的考虑,应该建立物化视图或者实际的物理表。
这样,维度保持一致后,事实就可以保存在各个数据集市中。虽然在物理上是独立的,但在逻辑上由一致性维度使所有的数据集市是联系在一起,随时可以进行交叉探察等操作,也就组成了数据仓库。
父子维
父子维度基于两个维度表列,这两列一起定义了维度成员中的沿袭关系。一列称为成员键列,标识每个成员;另一列称为父键列,标识每个成员的父代。该信息用于创建父子链接,该链接将在创建后组合到代表单个元数据级别的单个成员层次结构中。
父子维度通俗的话来讲,这个表是自反的,即外键本身就是引用的主键;类似这样的关系,如公司组织结构,分公司是总公司的一部分,部门是分公司的一部分,当然如果定义得好的话员工是部门的一部分;通常公司的组织架构并非处在等层次上的,例如总公司下面的部门看起来就和分公司是一样的层次。因此父子维的层次通常不固定的。因为父子维的复杂的自引用关系,如果按照缓慢维度的全历史记录方式来处理,必然导致逻辑关系混乱,处理起来比较棘手;任何一个组织的变动(修改名称,更改引用,新增等等操作)将会引起其下属节点相应的变动;任何一个意外都会导致整个结构的变化,同时发生意外后所带来的逻辑关系很难理顺。因此建议按照缓慢变化维的覆盖方式解决,即只根据主键这个唯一标志进行判断是否是新增还是修改。
缓慢变化维
在以维度建模的数据仓库中,有一种概念叫做缓慢变化维,Slowly Changing Dimension。缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化。这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题。
处理的一般方法:
1.直接覆盖历史数据。
如果该维度数据的变化并不是你所关心的,那么可以采用直接覆盖历史数据的方法。比如,员工表中某员工的政治面貌发生变化,你不关心这一点则可以直接覆盖历史数据。
2.保留历史纪录并添加一个标志位。
该方法直接添加新纪录,并将历史纪录的标志位设为Inactive,新纪录标志位设为Active。如果需要还可以附上时间戳,表明旧纪录是何时失效的。
3.利用不同的字段保存不同值。
新加一个历史值字段,一个时间戳字段,一个新值字段。该方法若要保存若干条历史纪录则字段数会很多,不清晰明了。
4.新建一个表来保存历史纪录。
相当于把方法2中Inactive的数据保存于另外一张表中,原表中只保存Active的数据。
5.常规混合方法
这种模式是以上几种模式的混合体,相对而言此种方法更全面,更能应对错综复杂且易变化的用户需求,也是较为常用的。 此方法有以下几条优点: 能用简单的过滤条件选出维度当前的值; 能较容易的关联出历史任意一时刻事实数据的值; 如果事实表中有一些时间字段(如:Order Date, Shipping Date, Confirmation Date),那么我们很容易选择哪一条维度数据进行关联分析。
6.非常规混合方法。
该方法在方法2的基础上添加一个版本的字段,当前版本值为0,历史版本为1,2,3,4…新数据插入时则版本号都加1. 并且在事实表中,为每条纪录添加一个版本号字段和维度表对应,这样可以解决维度表和事实表的多对多关系而不用使用时间戳作为查询的条件。
举例:维度表的设计(零售)日期维度
日期维度和其他维度不同,可以提前建立日期维度表。可以在表中按行表示10年或者20年甚至是100年的不同日期。可以涵盖存储的历史,也可以包含未来的几年,日期维度表是相对较小的维度表。

注意点:
1,维度模型总会需要详尽的日期维度表。sql日期函数不支持范围广泛的日期属性,包括周,财务周期,季节,假日,周末等。与其试图将这些非标准日历计算放入查询中,不如放在日期维度表中,通过查询直接获得。
2,将当天的时间作为维度或者事实的时候,例如15分钟间隔,小时,换挡等。当天的时间通常从日期维度中分离出来,以避免提高执行维度计算的复杂性。
3,对于当前和相对日期的属性,我们交给BI应用去处理
4,对于日期维度中的文本属性和标志,例如是否是周末,是否是假日等。建议使用文本方式标识。我个人采用了代码编码标识,如图上图所示。
产品维度
产品维度描述仓库中存储的每一个SKU(产品统一编码)。多数零售商在其总部管理其产品主文件,并将部分子集频繁地下载到每个商店的POS系统上。为每个商品定义适当的产品主记录(唯一的sku)是管理层的职责。
1、扁平化多对一层次。通常不用担心扁平化对存储空间的要求。将重复的低粒度值保存在主维度表中是一种基本的维度建模技术。
2、设计具有内嵌含义的属性。在维度表中按照自然键概念确定的操作型产品代码,通常情况下具有内嵌含义,不同部分表示产品的不同特征,多个部分组成的属性都应该完整的保存在维度表中。例如操作型代码的第1到第4表示渠道商,第5到第10个字符表示制造商,则渠道商,制造商的名称也应该包含在维度表属性中。
3,所为属性或者事实的数字值。如果数字是用于计算,则应该属于事实表,如果数字能预先定义稳定的数字值,则应该当成维度属性。有时候,数字值同时可以用于计算以及过滤/分组功能,那么应该在事实表和维度表同时存储该值。
4,下钻维度属性。合理的产品维度可以包含50个左右描述性属性,每个属性可以作为约束和构建行头指针表识的来源,在维度模型上进行下钻,只不过是在维度表中增加了行头指针属性。上卷操作将移除行表头。
商店维度
1,多层次维度表。每个商店可以考虑为一个地址。可以按照任何地理属性对商店进行上卷操作,例如:邮编、国家、省、市。跨多个层次的属性名称和值应该具有唯一性。
图中的Floor Plan类型,Photo Processing 以及Financial Service类型都是短文本描述符,描述特定的商店,不要用一位字符代码描述他们,使用具有可理解的含义。
2,商店维度表中的日期。如果用户希望按照被标准日历去分组和约束,则通常需要和日期维度一起去使用
促销维度
促销维度描述了促销的条件。促销条件包括临时降价,终端通道展示,报纸广告,礼券等。促销维度通常被认为是一种因果维度,因为他描述了认为可能导致产品销售发生改变的原因。
促销是否有效通常从以下几个因素考虑:
1,提升:促销产品的销售是否在促销期间获得大幅提升。
2,降低:促销产品在促销前,促销后,与促销期间的销售比较,是否有降低。
3,销售侵蚀:促销产品在销售方面表现良好,但是其他类似的产品销售却明显降低了。
4,市场增大:促销分类中的所有产品是否都获得了销售方面的净总增益,对比促销前,促销期间,促销后。
5,促销是否有利可图。促销的利润考虑整个促销分类的利润与基本销售利润之比,需要考虑促销期间的销售侵蚀以及促销开销的影响。
存粹从逻辑上考虑,通常将4个不同的因果机制(降价,广告,展示,礼券)区分开,建立不同的维度表而不是合并在一个维度中。
合并优势:
1,如果4个因果机制高度关联,合并而成的单一维度,不会比任何一个单独维度大很多。
2,合并为单一维度浏览方便,观察降价,广告,展示,礼券的相互影响关系。
拆分优势:
1,对业务群体来说,当分别考虑不同机制时候,不同的维度可能更容易理解。
2,对不同维度的管理可能比合并维度的管理更直接
维度划分
任何出现在事实表度量事件中的表示单一值的描述性属性都可以选为维度
有关某个维度是否应该和某个事实表关联的决策应该基于事实表申明的粒度来确定是或者不是
还有退化维度是没有对应维度表的维度键,例如事务空值号码,订单号码,发票号码,提货单号码,通常产生空。

楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-2 20:44

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表