一文搞懂什么是“退化维度”
引言
“维度退化”是数据仓库维度建模中的概念,当你想要理解这个名词的时候,相信你一定大致了解什么是事实表、维度表了,那就直接开始吧。
正文
一、官方解释
百度百科的解释如下:
退化维度(Degenerate Dimension,DD),就是那些看起来像是事实表的一个维度 关键字 ,但实际上并没有对应的维度表,其中,事实表的粒度就是文档本身或文档中的一个分列项。 具体怎么理解呢?在传统的父子 关系型数据库 中,事务编号是事物标题记录的关键字,比如订单编号、发票编号,这样的纪录包含了诸如事务日期、供应商标示这样在总体上对事务有效的所有信息。但在给出的维度模型中,已经将这些令人感兴趣的标题信息抽取出来放到其它 维度 中去了。但这个事务编号仍然十分有用,因为它可以作为组关键字而将单个事务中处理的明细集中在一起。
尽管这个事务维度看起来是一个维度关键字,但当把事务维度所有的描述性项目进行剔出后,形成维度为空。诸如这种事务编号、固有的操作型票据编号,应该自然的放入事实表中,而不用连接到维度表。退化维度在事实表粒度表示单个事务或事务分列项目时是很常见的,因为它标示父实体的惟一标示。订单号,发票号与提货单编号等几乎总是以退化维度的形式出现在维度模型之中。同时,退化维度在事实表主关键字方面也有一定作用。比如将订单事实表主关键字可以由退化的订单编号和产品组关键字组成。
二、实例解释
是不是看了官方解释感觉好像明白了又有点迷糊,那接下来就让我拆开揉碎了解释一番。
假设我们有这样一张事实表(多事务):服务订购订单事实表
表结构如下:
字段 |
字段中文名 |
order_id |
订单ID |
buyer_id |
订购者ID |
severice_id |
服务ID(691175:商城版;690529:小程序;2085817039:旺铺卡) |
severice_name |
服务名称 |
order_type |
订单类型(0:新订购 ,1:续订 ,2:升级) |
crt_order_time |
下单时间 |
pay_order_time |
支付时间 |
pay_order_amt |
支付金额(元) |
从表结构可以看出,该表存储的内容是买家每下单一种服务时产生的相关信息记录。为了站在订购者的角度去分析数据(如:当月各个渠道总支付金额数),理论上可以设计一张订购者维表,存储订购者的相关属性(性别、年龄、渠道来源、电话、地区等等)。
事实表的粒度就是文档本身或文档中的一个分列项:事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可
以通过两种方式来表述:一种是维度属性组合(分列项)所表示的细节程度;一种是所表示的具体业务含义(文档本身)。
而在这张事实表中,粒度即为订单ID。
那么在上面这张事实表中,哪个字段看上去像维度关键字,却又不需要为它单独设计一张维表呢?
如果设计一张服务维表是否可行,包含字段(服务ID、服务名称、服务类型、服务上架时间、服务时长等等)?
退化维度是这样一种维度:过于简单或诸如订单ID这种量级很大的维度,不值得单独创建一个维表进行存储。
那么,订单ID和服务ID(服务维表可剔除,维度属性可放在事实表中)都可以作为退化维度
但这个事务编号仍然十分有用,因为它可以作为组关键字而将单个事务中处理的明细集中在一起:如统计各项服务的订单个数,severice_id作为组关键字,汇总该维度下的订单个数count(order_id)
至此,再看看官方解释就不难理解了
三、退化维度优点
减少事实表和维度表的关联
该技术减少维度的数量, 简化维度数据仓库模式。 简单的模式比复杂的更容易理解, 也有更好的查询性能。
如果存在退化维,ETL的过程会变得非常容易
可以让group by 等操作变得更快
四、总结
当一个维度没有数据仓库需要的任何数据的时候就可以退化此维度,需要把退化的相关数据迁移到事实表中,然后删除退化的维度。退化维度没有对应的维表,但可以获取与之相关的事实,如上订单号对应的订购者,服务对应的订购金额等。
Kimball书中对退化维度的描述为:操作型事务控制号码,例如:订单号码,发票号码,提货单号码通常产生空的维度,经常保存为事实表中的退化维度。退化维度是没有对应维度表的维度键。
一文搞懂什么是“退化维度”相关推荐
- 一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 一文搞懂k近邻(k-NN)算法(一)
原文链接 一文搞懂k近邻(k-NN)算法(一) 前几天和德川一起在学习会上讲解了k-NN算法,这里进行总结一下,力争用最 通俗的语言讲解以便更多同学的理解. 本文目录如下: 1.k近邻算法的基本概念, ...
- 一文搞懂 Python 的 import 机制
一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...
- python语言语句快的标记是什么_一文搞懂Python程序语句
原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...
- 一文搞懂 Java 线程中断
转载自 一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...
- 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm
***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...
- 一文搞懂如何使用Node.js进行TCP网络通信
摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...
- 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass
本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...
- 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下
B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...
最新文章
- 【图灵奖大佬】Yoshua Bengio最新《深度学习》教程
- eclipse修改文件代码不起作用,输出时还是老的,估计是缓存问题
- 深入cocos2d-x中的touch事件
- [ImportNew]Java中的Timer类和TimerTask类
- Excel单样本T检验
- android 一个很漂亮的控件ObservableScrollView(含片段代码和源码)
- 数据交换平台_从零开始理解大数据架构之数据交换平台
- 安卓桌布显示的dip和px
- 【maven3学习之一】window7下maven环境搭建
- PC端 二维码/条形码扫描器1.1-支持截图+摄像头+本地图片+扫描枪识别
- Android 福彩3D体彩排列(源码+算法)
- win7网络改局域网计算机名,局域网共享一键修复工具(支持win7) 修复windows7各种共享问题...
- 万字干货,分布式数据库 HBase 中文入门指南
- 我的大学六年(郭天祥原创)
- java数据库验证用户名,java新手:注册时验证用户名是否在数据库里已存在
- 斗鱼连续6个季度亏损:活跃用户降幅明显,虎牙市值是前者的两倍
- macOS使用快捷键控制安卓手机音乐播放器
- GB(国标)字典大全
- Deepin v20 Beta 手动更新深度应用中安装的火狐浏览器中国版
- LeetCode 每日一题 2021-4-25 (递增顺序搜索树)
热门文章
- 计算机话题作文,雅思话题作文范文:电脑与现代教育
- win10下通过wubi.exe安装ubuntu
- C++中resize函数的用法
- B.数据挖掘[一]---汽车车交易价格预测(测评指标;EDA)
- 小米iot业务_小米AI与IoT这两大未来核心业务的战略布局
- Python处理pdf文件 - pdfminer、pdfplumber
- SFFAI分享 | 李永露:PaStaNet:Toward Human Activity Knowledge Engine
- 06-Vector-向量拼接
- [随想]关于移动支付
- MyBatisPlus主键生成策略