事实表的指标维度表_维度建模的灵魂所在:维度表设计
关注上⽅“ Python数据科学 ”,选择星标, 精彩⽂章不会错过!
前⾔
维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(⽐如维度变化、维度层次、维度⼀致性、维度整合和拆分等)都会直接关系到维度建模的好坏,因此良好的维表设计就显得⾄关重要,今天就让我们就⼀起来探究下关于维表设计的相关概念和⼀些技术。
维度变化
维度表的数据通常来⾃于前台业务系统,⽐如商品维度表可能来⾃于 ERP 或者超市 POS 系统的商品表,但商品是会发⽣变化的,⽐如商品所属的类⽬ 、商品标签价格、商品描述等,这些变化有可能是之前有错误需要订正所致的,或者是实际的业务情况变化。
不管哪种情况,维度设计过程中,确定源头数据变化在维度表中如何表⽰⾮常重要。因此在维度建模中,这⼀现象称为缓慢变化的维度,简称 缓慢变化维(slowly changing dimension, SCD)。
根据变化内容的不同,下游的分析可能要求⽤不同的办法来处理
⽐如对于商品的描述信息,也许业务⼈员对此并不敏感,或者认为⽆关紧要,这种情况可以直接覆盖 。 但是对于商品所属的类⽬发⽣变化,则需要认真考虑, 因为这涉及归类这个商品的销售活动到哪个类⽬⼀⼀是全部归到新类⽬,还是全部归到旧类⽬?变化前归到旧类⽬,还是变化后归到新类⽬?这实际上也涉及了下⾯要分享的缓慢变化维的⼏种处理办法。
1. 重写维度值大一c语言图书管理系统代码
当⼀个维度值属性发⽣变化时,重写维度值⽅法直接⽤新值覆盖旧值。 该技术适⽤于维度建模中不需要保留此维度属性历史变化的情况,常⽤于错误订正或者维度属性改变⽆关紧要的场景,⽐如⽤户的
⽣⽇之前发⽣输⼊错误,不需要保留之前的⽣⽇历史数据。 那么采⽤重写维度值的⽅法,就将会改变此维度属性的所有历史度量。 ⽐如,分析师希望分析星座和销售的关系,之前⽤户的⽣⽇属于⽩⽺座,但是修改后的⽣⽇属于双⼦座,那么维度属性修改后,其销售额将都属于双⼦座。因此维度设计⼈员只在必要情况下使⽤此⽅法,同时需要告知下游分析⼈员。 采⽤重写维度值⽅法的维度表和事实表变化如图:
采⽤重写维度值⽅法处理变化维⽰例
2. 插⼊新的维度⾏
相⽐重写维度值⽅法不维护维度属性变化的特点,插⼊新的维度⾏⽅法则通过在维度表中插⼊新的⾏来保存和记录变化的情况。 属性改变前的事实表⾏和旧的维度值关联,⽽新的事实表⾏和新的维度值关联。
采⽤插⼊新的
jq和vue的区别及优缺点维度⾏⽅法处理缓慢变化维⽰例
最好的python入门教材我们仔细观察变化后的维度表可以发现,新复制了⼀⾏该⽤户的信息,唯⼀不同在于 state 的不同(之前是 AZ,之后是 CA)。同时,仔细观察订单事实表也会发现,过去的订单是和旧的唯独⾏关联,⽽新
的订单和新的维度⾏关联。 通过新增维度⾏,我们保存了维度的变化,并实现了维度值变化前的 实和变化后的事实分别与各⾃的新旧维度值关联。 但是这也给维度表⽤户带来了困惑,为什么查询会员会在维度表中发现多⾏记录?尽管可以向⽤户解释,但是⽤户的使⽤和学习成本⽆疑增加了, ⽽且数据开发⼈员对于维度变化的处理逻辑⽆疑更复杂了。
3. 插⼊新的维度列
在某些情况下,可能⽤户会希望既能⽤变化前的属性值,⼜能⽤变化后的属性值来分析变化前后的所有事实。此时可以采⽤插⼊新的维度列
matlab repmat函数
软件运维工程师这种⽅法。
采⽤插⼊新的维度列处理缓慢变化维⽰例 不同于前⼀种⽅法的添加⼀⾏,这种⽅法通过新增⼀列,⽐如⽤ region_previous 列表⽰之前的所属⼤区,同时新增 region_current 来表⽰变化后的所属⼤区。如果有多次变化,就需要有多个列来存储。 实际上,这三种⽅法都能从不同⾓度解决维度变化的问题,还有通过组合这三种⽅法形成的其他各种技术可⽤于处理维度变化,这⾥就不再赘述。 当然了,不管哪种技术,在⼤数据时代都不是完美的,⽽且有⼀定的处理复杂度和学习使⽤成本。 如何以⼀种最简单、直接的办法来解决维度变化呢?我们在后⾯会聊聊 快照技术 ,以解决⼤数据时代的维度变化问题。
维度层次
维度层次指的是某个维度表中属性之间存在的从属关系问题。⽐如商品的类⽬可能是有层次的(⼀级类⽬、⼆级类⽬、三级类⽬等,尤其对于宝洁、联合利华等⼤的快消企业集团),同时类⽬、品牌和产品实际上也是有层次的。那么维度建模如何处理这些层次结构呢? 实际上有两种处理办法:
1. 第⼀种是将所有维度层次结构全部扁平化、冗余存储到⼀个维度表中,⽐如商品的⼀⾄三级类⽬分别⽤三个字段来存储,品牌等的处
理也是类似的;
2. 第⼆种是新建类⽬维度表,并在维度表中维护⽗⼦关系。
第⼀种其实就是星型架构,第⼆种是雪花架构。在维度建模中,我们采⽤第⼀种来处理维度的层级问题,这样反规范化的处理牺牲了部分存储,但是给⽤户使⽤带来了便捷,也降低了学习使⽤成本。
维度的层次结构通常和钻取联系在⼀起,所谓钻取即是对信息的持续深⼊挖掘。
钻取分为向上钻取和向下钻取,⽐如对于某零售商的年度销售报表,其年度销售总额显⽰增长20%,那么从时间上分析是哪个季度的增长率⽐较⾼呢? 此时可以向下分析各个季度的增长率,同样可以继续向下分析到⽉增长率乃⾄天增长率,同样的分析也可以应⽤到类⽬ 、品牌等,来分析到底是哪个类⽬的增长或者哪个品牌的增长导致了年度总销售额的增长 20% 。这就是向下钻取。 与之相对的是向上钻取,钻取的实质是增加或者减少维度,增加维度(向下钻取)从汇总数据深⼊到细节数据,⽽减少维度(向上钻取)则从细节数据概括到汇总数据 。通过
钻取,⽤户对数据能更深⼊地了解数据,更容易发现问题,从⽽做出正确的决策。
维度⼀致性
在 Kimball 的维度设计理论中,并没有物理上的数据仓库。数据仓库是在对多个主题、多个业务过程的多次迭代过程中逐步建⽴的,这些多个问题、多个业务过程的多次迭代过程常被从逻辑上划分为数
据集市。 所谓数据集市⼀般由⼀张和多张紧密关联的事实表以及多个维度表组成,⼀般是部门级的或者⾯向某个特定的主题。数据仓库则是企业级的、⾯向主题的、集成的数据集合。 物理上的数据集市组合成逻辑上的数据仓库, 旦数据集市的建⽴是逐步完成的,如果分步建⽴数据集市的过程中维度表不⼀致,那么数据集市就会变成孤⽴的集市,不能从逻辑上组合成⼀个集成的数据仓库,⽽维度⼀致性的正是为了解决这个问题。
维度⼀致性的意思是指:两个维度如果有关系,要么就是完全⼀样的,要么就是⼀个维度在数学意义上是另⼀个维度的⼦集。
不⼀致既包含维度表内容的不 致,也包含维度属性上的不⼀致。
⽐如对于⼀个电⼦商务公司,如果其浏览等相关主题域的商品维度表包含了该企业的所有商品的访问信息,但是由于某种原因其交易域的商品缺失了部分商品 (有可能是成交在其他平台完成),那么对这些缺失商品的交易分析就⽆法完成 。
同样如果两的商品属性不同,⽐如⽇期格式、类⽬划分(有可能浏览分为前天类⽬,成交是后台类⾃)等不⼀致,那么跨浏览域和交易域的对类⽬和⽇期的交叉分析就⽆法进⾏,因为其类⽬划分就不⼀致。
维度⼀致性对于数据集市成为数据仓库起着关键作⽤,实际数据集市设计和开发过程中,必须保证维
度⼀致性,具体可以采⽤共享同⼀个维度表或者让其中⼀个维度表是另外⼀个维度表的⼦集等⽅式来保证⼀致性,从⽽避免孤⽴数据集市的出现。
维度整合和拆分
实际维度表设计中,有时候会出现同⼀个维度表来⾃于多个前台业务系统的问题,此时就会带来维度整合和拆分问题。 前台的业务系统通常是⽐较复杂的,⽐如移动端交易系统和PC端交易系统的系统架构和底层数据库、表结构等完全不⼀致,此时就存在维度的整合问题。 在实际整合中,同⼀个维度整合需要考虑如下问题:
命名规范:要确保⼀致和统⼀
字段类型 :统⼀整合为⼀个字段类型
字段编码和含义:编码及含义要整合为⼀致
与整合相对的是拆分
对于⼤的集团公司来说,以中⽯化为例,其主业为成品油销售,但是同时其还有中⽯化加油站的快捷零售店(在此仅做说明问题使⽤),它们的商品表字段和属性由于业务的不同⽽存在很⼤的差异(⽯油商
品和零售店销售的⾷品、饮料等)。 此时需要⽤⼀个统⼀整合的商品表么(从直觉来说是不需要的,因为业务差异巨⼤)?
在维度建模理论中,对于上述情况通常有两种处理办法
1. 建⼀个基础的维度表, 此基础维度表包含这些不同业务的共有属性,同时建⽴各⾃业务的单独维度表以包含其独特的业务属性。⽐
如,上述例⼦就可以建⽴⼀个共有的商品维度表记录商品价格、商品描述等共有属性字段,同时建⽴成品油销售的商品维度表记录油标号( 92 95 97 等)等成品油独特的商品属性,另外建⽴⼀个零售商品维度表记录便利店的各种商品属性(实际操作中通常先建⽴两个单独的维度表,然后基于单独维度表⽣成共有的商品维度表或者视图)
2. 拆分,即不合并,即各个业务差异独特性的业务各⾃建⽴完全独⽴的两个维度表,各⾃管理各⾃维度表和属性。
我们在实际操作中 ,对于业务差异⼤的业务,偶合在⼀起并不能带来很⼤的便利和好处,因此通常倾向于拆分(即不合并),各⾃管理各⾃的维度表。⽽对于业务相似度⽐较⼤的业务,则可以采⽤上述的第⼀种⽅法。 我是东哥,最后给⼤家免费分享⼊门Python的最强三件套: 《ThinkPython》、《简明Py
成品短视频网站入口thon教程》、《Python进阶》的PDF电⼦ 版。如果你是刚⼊门的⼩⽩,不⽤想了,这是最好的学习教材。 现在免费分享出来,有需要的读者可以下载学习,在下⾯的 GitHuboy ⾥回复关键字 : Python ,就⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论