数据仓库建模(四):维度表的设计

news2025/1/12 3:45:06

数据仓库建模(四):维度表的设计

    • 一、维度表的整体结构
      • 1.1 维度表的结构设计
      • 1.2 维度代理键
      • 1.3 自然键、超久键和超自然键
      • 1.4 下钻与上卷
      • 1.5 维度退化
      • 1.6 非规范化的扁平维度
      • 1.7 多层次维度
      • 1.8 维度属性的标识与状态信息
      • 1.9 维度表中的空值属性
      • 1.10 日历日期维度
      • 1.11 扮演角色的维度
      • 1.12 杂项维度
      • 1.13 雪花维度
      • 1.14 支架维度
    • 二、使用一致性维度集成
      • 2.1 一致性维度
      • 2.2 缩减维度
      • 2.3 钻表跨取
      • 2.4 价值链
      • 2.5 企业数据仓库总线架构
      • 2.6 总线矩阵实现细节
      • 2.7 机会/利益相关方矩阵

一、维度表的整体结构

1.1 维度表的结构设计

① 包含单一的主键

每个维度表都包含单一的主键列。

② 行的描述环境要和事实表行完全对应

维度表的主键可以作为与之关联的任何事实表的外键,维度表行的描述环境需要和事实表行完全对应。

③ 维度表通常比较宽

维度表通常比较宽,是扁平型非规范表,包含大量的低粒度的文本属性,维度表的属性是查询及BI应用的约束和分组定义的主要目标。

1.2 维度代理键

维度表中会包含一个列,表示唯一的主键。(维度代理键其实就是维度表的主键)

该主键不是操作系统的自然键,由于需要跟踪变化,因此若采用自然键,将需要多个维度行表示。维度的自然键可能由多个源系统建立,这些自然键将出现兼容性的问题,难以管理。

DW/BI系统需要声明对所有维度的主键管理,因此无法采用单一的自然键或附加日期的自然键,可以为每个维度建立无语义的整型主键。这些维度代理键是按顺序分配的简单整数,以值1开始。每当需要新键时,键值自动加1。

注:日期唯独不需要遵守代理键规则,日期维度是高度可预测的且稳定的维度,可以采用更有意义的主键(见1.10)。

1.3 自然键、超久键和超自然键

由操作系统建立的自然键受业务规则影响,无法被 DW/BI 系统控制。

例如,如果雇员辞职,然后重新工作,则雇员的编号(自然键)可能会发生变化。数据仓库希望为该雇员创建单一键,这就需要建立新的持久键以确保在此种情况下,雇员编号保持持久性,不会发生变化。

该示例中的主键有时会被称之为超自然键

最好的持久键其实应该独立于原始的业务过程,并以整数1开始进行分配,多个代理键与某一个雇员关联时,若描述发生变化时,持久键不会发生变化。

题外话:这里的自然键在实际业务中其实使用意义不大,它看起来没有实际的价值,在上面的示例中,我们一般会使用用户的身份证编号来作为他的编码,这样就保证了雇员编号持久性。

1.4 下钻与上卷

维度中有不同的层次,每个层次可以有多个级别,这样就可以根据多个维护层次和级别进行分析,可以灵活获取高级别的汇总信息,获取低级别的明细信息。把获取高级别的汇总信息的过程叫上卷,把获取低级别的明细信息的过程叫下钻

假设时间维度有四个级别,分别是年、月、天、小时,现在我们某个级别分析每天的课程访问量,比如按天分析网页的访问量,此时我们可以按小时下钻分析,得出一天内每小时的网页访问量,也可以按月上卷,得到月度的网页访问量

1.5 维度退化

有时,维度表除了主键外没有其他内容。

例如,当某一发票包含多个数据项时,数据项事实行继承了发票的所有描述性维度外键,发票除了外键外无其他项,但发票数量仍然是此数据项的合法维度键(可以看作数字度量也可以看作维度键,角度不同)。

我们把这种数据退化到维度表中,即表明该字段是维度退化字段,也表明该字段没有对应的维度表。

常见的事实表的主键、日期字段、时间戳等都属于退化维度。

在这里插入图片描述

这个概念比较绕,我来仔细讲下:
在订单表中,用户下单对应一个订单事件,那么用户订单表自然就是事实表了,那么订单编号字段呢?不属于事件的度量,订单编号其实是一个维度字段,我们假如将该字段新建一张订单维度表,我们此时需要把该订单编号对应的其它维度数据放在该表(订单维度表)中,此时我们会发现,没有什么字段可以加入订单维度表(维度除了主键没有其它内容),此时我们就需要把该维度(订单编号)退化到事实表中(订单事实表)

1.6 非规范化的扁平维度

一般来说,维度设计者需要抵制由多年来操作型数据库设计所带来的对规范化设计的要求,并将非规范化的多对一固定深度层次引入扁平维度行的不同属性。

非规范化维度能苟实现维度建模的双重目标:简化及速度

1.7 多层次维度

多数维度包含不止一个自然层次。

例如,日历日期维度可以按照财务周期层次从天到周进行划分,也可能存在从天到月再到年的层次。位置密集型维度可能包含多个地理层次。

所有这些情况下,在同一维度中可以存在不同的层次。

1.8 维度属性的标识与状态信息

维度的定义不要太随意,尽量制定相应的规范,把业务指标的定义和维度关联起来。

令人迷惑的缩写、真假标识以及业务指标可以作为维度表中文本字词含义的补充解释。

状态信息码所包含的意义应分解成不同的表示不同描述行维度属性的部分。

1.9 维度表中的空值属性

当给定维度行没有被全部填充时,或者当存在属性没有被应用到所有维度行时,将产生控制维度属性。

上述两种情况下,我们推荐采用描述性字符串代替控制。例如,使用 UnknownNot Apllicable 替换空值。应该避免在维度属性中使用空值,因为不同的数据系统在处理分组和约束时,针对空值的处理方式不一致。

例如:如下是一个产品维度表,当某个维度属性没有被完全填充后,就可以使用 UnknownNot Apllicable 替换空值

产品编号产品名称产品类型产品状态
001abc示例产品一Unknow

1.10 日历日期维度

连接到实际事实表的日历日期维度,能够对事实表,按照熟悉的日期、月份、财务周期和日历上的特殊日期进行导航。

不要指望能够用SQL计算各个法定节假日,但可以在日历日期维度上寻找各个节假日,前提是在上一年底,生成一个完整的下一年的日历日期维度表。

日历日期维度通常包含许多描述,例如,周数、月份名称、财务周期、国家假日等属性。为了方便划分,日期维度主键可以更有意义,例如,用一个整数表示YYYYMMDD ,而不是用顺序分配的代理键。

然而,日期维度表需要特定的行表示未知或待定的日期。

若需要更详细的精确度,可以在事实表中增加不同的日期时间戳。日期时间戳不是维度表的外键,但以单独列的形式存在。如果商业用户按照当天时间(time-of-day)属性进行约束货分组,例如,当天时间或其它数字分组,则需要在事实表上新增一个 “当天时间(time-of-day)” 维度外键。

在这里插入图片描述

笔者公司的日历日期维度表,每年都会更新刷数到指定的表中,这样会减少很多的日期计算逻辑。

1.11 扮演角色的维度

单个物理维度可以被事实表多次引用,每个引用连接逻辑上存在角色纬度。

例如,事实表可以有多个日期,每个日期通过外键表示不同的日期维度,原则上每个外键表示不同的日期维度视图,这样引用具有不同的含义。

这些不同的维度视图(唯一的属性列名)被称为角色。

1.12 杂项维度

事务性商业过程通常产生一些列混杂的、低粒度标识和状态信息。

与其为每个标识或属性定义不同的维度,不如建立单独的将不同维度合并到一起的杂项维度。

这些维度通常在一个模式中标记为事务性概要纬度,不需要所有属性可能值的笛卡尔积,但应该只包含实际发生在源数据中的合并指。

杂项维度的特点:属性多但每个属性的值列表很少,并且极少修改

例如:在用户的销售事实表中,可能会存在大量的离散数据(状态信息),如:

verif_ind: 订单状态是否验证
credit_check_flag: 信用状态是否检查
new_customer_ind: 是否首次下单
web_order_flag: 是否为线上订单

杂项维度通常的处理方式:

① 忽略这些标志和指标

如果业务中可以忽略这些杂项纬度,那么可以在 DWS 层忽略这些杂项纬度

② 保留这些标志和指标

一般尽量不要在事实表中存储难以识别的标志位,尤其是当每个标志位还配有一个文字描述字段时。不要在事实表行中存储包含大量字符的描述符,因为每一行都会有文字描述,它们可能会使表快速地膨胀。
③ 将每个标志位放入其自己的维度中

将每个标志位当作普通的标志位处理,即每个标志位都有对应的纬度表,在装载事实表数据前先处理这四个维度表,然后在事实表中引用这些代理键(必要时需要生成新的代理键)

首先,当类似的标志或状态位字段比较多时,需要建立很多的维度表,其次事实表的外键数也会大量增加。
处理这些新增的维度表和外键需要大量修改数据装载脚本,还会增加出错的机会,同时会给ETL的开发、维护、测试过程带来很大的工作量。

因此杂项维度应该与普通维度的处理区分开

经验值:如果外键的数量处于合理的范围中,即不超过20个,则在事实表中增加不同的外键是可以接受的。但是,若外键列表已经很长,则应该避免将更多的外键加入到事实表中。

④ 创建新的维度表

我们可以分离出单独的维度表保存这些标志位字段的数据,它们的数据量很小,并且极少改变。事实表通过维度表的代理键引用这些标志。例如:创建单独的订单维度表,将这些杂项维度放入订单维度表中,通过订单号作为代理键,用于关联事实的杂项维度信息。

缺点:尽管创建了新的维度表,但是事实的每行数据仍热对应一个杂项维度,维度表仍然随着事实表的数量在膨胀。

⑤ 使用杂项维度表

创建杂项维度表,用于放置各种离散的标志或状态数据。

对杂项维度数据量的估算会影响其建模策略,例如,某个简单的杂项维度包含10个二值标识(是或否),则杂项维度表中最多包含1024(2^10)行。杂项维度可提供所有标识的组合(有效降低维度表的数据量),并用于基于这些标识的约束和报表。

事实表与杂项维度之间存在一个单一的、小型的代理键。

如果具有高度非关联的属性,包含更多的数量值,则将它们合并为单一的杂项维度是不合适的。
如果存在5个标识,每个仅包含3个值,则单一杂项维度是这些属性的最佳选择,因为维度最多仅有243(3^5)行。
但是如果5个没有关联的标识,每个具有100个可能值,建议建立不同维度,因为单一杂项维度表最大可能存在1亿(100^5)行。

杂项维度中行的组合确定并已知的前提下,是应该事先为所有组合的完全笛卡尔积建立行,还是建立杂项维度行,只用于保存那些在源系统中出现的组合情况的数据。

杂项维度创建千要看大概有多少可能的组合,最大行数是多少。一般来说,理论上组合的数量较小,比如只有几百行时,可以预装载所有组合的数据,而组合的数量大,那么在数据获取时,当遇到新标志或指标时再建立杂项维度行。当然,如果源数据中用到了全体组合时,那别无选择只能预先装载好全部杂项维度数据。

1.13 雪花维度

当唯独表中的层次关系是规范的时,低粒度属性作为辅助表通过属性键连接到基本维度表。这一过程包含多重维度表层次是,建立的多级层次结构称为雪花维度

尽管雪花维度模式可以精确表示层次话的数据,但还是应该避免使用雪花模式,因为对商业用户来说,理解雪花模式并在其中查询是非常困难的(雪花模式还会影响查询性能)

扁平化、非规范的维度表完全能够获得与雪花模式相同的信息。

1.14 支架维度

维度可以包含对其它维度的引用。

例如,银行账户维度可以引用表示开户日期的维度。这些被引用的辅助维度被称为支架维度。支架维度可以使用,但应该尽量少用。多数情况下维度之间的关联应该由事实表来实现。在事实表中通过两个维度的不同维度的外键相关联。

二、使用一致性维度集成

2.1 一致性维度

当不同的维度表的属性具有相同列名和领域内容时,称维度报表具有一致性。

利用一致性维度属性与每个事实表关联,可以将来自不同事实表的信息合并到统一报表中。当一致性属性被用作行头(就是说,用作SQL查询中的分组列)时,来自不同事实表的结果可以排列到跨钻报表的同一行。以上实现是集成企业DW/BI系统的基础。

一致性维度一旦在与业务数据管理方共同定义后,就可以被所有事实表重用。该方法可以获得分析一致性并减少未来开发的开销,因为不需要重新创建。

2.2 缩减维度

缩减维度是一种一致性维度,由基本维度的列与(或)行的子集构成。(一致性维度子集)

当构建聚集事实表是需要缩减上卷维度。当商业过程自然地获取粒度级别较高的数据时,也需要缩减维度。

例如,某个按月和品牌进行预测(不需要与销售数据关联的更远子级别的数据和产品),另外一种情况下,也就是两个维度具有同样粒度级别的细节数据,但其中一个仅表示行的部分子集时,也需要一致性维度子集。

2.3 钻表跨取

当每个查询的航头包含相同的一致性属性时,使不同的查询能够针对两个或更多的实时表进行查询。(通过公共的维度查询不同的事实表)

2.4 价值链

价值链用于区分组织中主要业务过程的自然流程。例如,销售商的价值链可能包括购买、库存、销售额等。

这里其实涉及到了数仓的建模,建模时,我们一般要根据业务过程去创建不同过程的事实表和维度表,Kimball 把这个称之为价值链。

价值链每个步骤都可以建立事务或快照,因为每个过程在特定时间间隔,采用特定的粒度和维度建立唯一的度量,所以每个过程通常指少建立一个原子事实表。

证券期货交易过程-价值链

2.5 企业数据仓库总线架构

企业数据仓库总线架构提供一种建立企业 DW/BI 系统的增量式方法。这一架构通过关注业务过程将 DW/BI 规划过程分解为可管理的模块,通过重用不同过程的标准化一致性维度发布实现集成。

企业数据仓库总线架构提供了一种架构性框架,同时支持可管理敏捷实现对企业数据仓库总线矩阵。总线架构中家属与数据库平台是独立的,无论是关系型数据库或者是 OLAP 维度结构都能参与其中。

2.6 总线矩阵实现细节

总线矩阵实现细节是一个更加力度话的总线矩阵,其中扩展每个业务过程以展示特定实施表货 OLAP 多维数据库。在此细节粒度上,可以文档化精确的力度描述以及事实列表。

2.7 机会/利益相关方矩阵

在确定了企业数据仓库总线矩阵行之后,可以通过替换包含业务功能(例如,市场、销售、财务等)的维度规划不同的矩阵。通过确定矩阵点以表示哪些业务功能与哪些业务过程相关。机会/利益相关方矩阵可以用于区分哪些业务过程分区应该与过程中心行相关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

趣学算法(2)

14天阅读挑战赛 目录前言一 几类时间复杂度二 兔子数列1.问题分析2.方法13.方法24.方法3最后前言 这篇文章是《趣学算法》的读书笔记,也对数据结构与算法的初步介绍,阅读这篇文章,我会带你改进一个算法。 一 几类时间复杂度 常见的算法时间复…

Vue项目的记录(十三)

1.登录注册静态组件 assets这个文件夹放所有的组件公用的静态资源 在样式当中也可以使用符号,(src目录的别名),要注意的是在前面你加上~ 2.注册业务 这里的验证码,正常来说应该是要后台发送到用户手机上&#xff0c…

拓端tecdat|R语言辅导配对检验分析案例

全文链接:http://tecdat.cn/?p3424 原文出处:拓端数据部落公众号 什么是检验对? 检验对的形式 (x1,x2) 出现在两种情况中: 对同一实体执行两次测量。例如,一项评估新型胰岛素疗效…

C-文件操作实现数据持久化,帮你快速了解文件操作函数

目录 一.了解文件 二.文件的打开和关闭 三.顺序读写文件函数 fputc字符输入函数 fgetc字符输入函数 fputs文本行输出函数 fgets文本行输入函数 fprintf格式化输出函数 fscanf格式化输入函数 fwrite二进制输出函数 fread二进制输入函数 四. 解析上述的流 五.文件的随机…

Redis 主从安装-Centos

Redis 主从安装-Centos 由于机器有限,所以接下来的教程都是在一台虚拟机中进行部署安装. Redis主从工作原理 如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个PSYNC命令给master请求复制数据。master…

计算机网络--传输层

这篇博客博主应该在前天就要完成的,但是博主忙乱了,又堕落几天,希望大家别像我一样最近学习三天打鱼,两个天晒网的。此后博主为了激励自己重头再来,就特意换了个发型,哈哈。回到正题,传输层也是…

操作系统真相还原_第4章:进入保护模式

文章目录实模式的缺陷保护模式的扩展段寄存器的变化寄存器扩展寻址扩展全局描述符表GDT描述符格式字段含义进入保护模式步骤解释示例说明程序编写boot.incmbr.sloader.s编译并写入硬盘启动bochs执行实模式的缺陷 1、实模式下用户程序所引用的地址都是指向真实的物理地址&#…

计算机等级考试Python二级

补记录一下之前考Python二级的一些相关理论记录 数据结构与算法 算法杂度 算法复杂度用来衡量算法的优劣,它包括算法的时间复杂度和算法的空间复杂度 时间复杂度:执行算法所需要的计算量【所需要的计算工作量是用算法所执行的基本运算次数来度量的】 …

子串和子序列问题-动态规划向

1. 子串子序列问题概述 有关于子序列和子串的问题是字符串或者数组经常会遇到的问题,一般我们经常使用多指针,滑动窗口,回溯,动态规划的方式去解决,而本篇重点关注能用动态规划解决或者说明显使用动态规划解决的子串问…

Java开发手册解析_编程规约-集合处理

前言 《Java开发手册(黄山版)》编程规约-集合处理 该章节的知识点基本都来源于jdk源码,将结合源码及例子进行理解 备注:文章中的详细及说明为手册本身内容 博客地址:芒果橙的个人博客 【http://mangocheng.com】 1.【强…

服务与发现

文章目录服务与发现什么是服务发现应用层服务发现模式平台层服务发现模式服务与发现 假设你正在编写一些调用具有 REST API 的服务的代码,为了发出请求,你的代码需要知道服务实例的网络位置(IP 地址和端口),在物理硬件…

整型数据是如何在内存中存储的

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一. 整型在内存中的存储1.1 整型…

Vue2生命周期详细图解和代码

加油&#xff0c;新时代打工人&#xff01;&#xff01;&#xff01; 话不多说&#xff0c;看图。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

C语言数据结构——链表

C语言数据结构——链表 链表包括单链表&#xff0c;双链表&#xff0c;循环链表等。 而今天要说的是单链表&#xff0c;它是一个线性表&#xff0c;它在内存中是无序的&#xff0c;由一个个指针来连接。 图示&#xff1a; 小方块代表的就是存储的数据&#xff0c;箭头就是指…

(46)STM32——FATFS文件系统实验

目录 学习目标 运行结果 文件系统 常用系统 FATFS 特点 结构图 移植步骤 disk_initialize disk_status disk_read disk_write disk_ioctl get_fattime 代码 总结 学习目标 我们要来介绍的是FATFS文件系统&#xff0c;这是一个为嵌入式设计的文件系统&#xff0c…

大学科目网课搜题接口

大学科目网课搜题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…

【1024社区大奖】让你一小时内狂揽大奖[保姆级教程①]

四层挑战&#xff0c;一小时内拿捏&#xff01;&#xff08;上&#xff09;一、龙蜥社区大奖二、战前准备1.注册码云Gitee2.注册龙蜥社区三、开始挑战&#xff0c;包揽大奖&#xff01;①第一层&#xff1a;小龙推荐 [15分钟]②第二层随机试炼 [15分钟]一、龙蜥社区大奖 活动分…

【论文笔记】Transformer-based deep imitation learning for dual-arm robot manipulation

【论文笔记】Transformer-based deep imitation learning for dual-arm robot manipulation Abstract 问题&#xff1a;In a dual-arm manipulation setup, the increased number of state dimensions caused by the additional robot manipulators causes distractions and …

微信小程序入门与实战之更多电影列表与电影搜索

wx.request的更多参数详解 在网络请求中我们可以采用下面这种形式&#xff1a; 如果我们可以不采用直接写在url的方式我们可以采用data的方式&#xff1a; 默认请求方式是GET我们可以通过设置method修改请求方式&#xff1a; 更多电影页面 我们要实现的效果&#xff1a;…

应用层——HTTP协议

文章目录一、应用层1.1 应用层概念1.2 再谈协议二、网络版本的计算器网络计算器编码部分版本1&#xff1a;原生版本版本2&#xff1a;引入序列化和反序列化三、HTTP协议3.1 URL3.2 urlencode和urldecode3.3 HTTP协议格式3.3.1 请求报文3.3.2 响应报文3.4 HTTPDemo3.4.1改进3.4.…