数据仓库工具箱—读书笔记02(Kimball维度建模技术概述02、事实表技术基础)
Kimball维度建模技术概述
记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣

第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同哈哈 确实比抽象地讲解概念要好理解🤣🤣🤣)。
书中从第三章开始是通过各行业的用例去讲解维度建模,第二章则是维度建模技术的总体介绍(很多概念,挺抽象的🤣🤣🤣)。
前言部分作者也有提到:我们并不期望您一开始就从头到尾阅读本章,但希望您能将本章作为所提供的技术参考。本节介绍的技术,在所有维度设计工作中都需要考虑。本书的每一章几乎都会涉及本节所介绍的概念。
Kimball维度建模技术概述01、基本概念
书接上回~🤣🤣🤣🤣🤣🤣
Kimball维度建模技术概述
- Kimball维度建模技术概述
- 2.2 事实表技术基础
- 2.2.1 事实表结构
- 2.2.2 可加、半可加、不可加事实
- 2.2.3 事实表中的空值
- 2.2.4 事务事实表(Transactional Fact Table)
- 2.2.5 周期快照事实表(Periodic Snapshot Fact Table)
- 2.2.6 累计快照事实表(Cumulative Snapshot Fact Table)
- 整理不易 列位点赞收藏关注多多支持🤣🤣🤣~
2.2 事实表技术基础
2.2.1 事实表结构
- 发生在现实世界中的操作型事件,其所产生的可度量数值,存储在事实表中。
- 事实表的设计完全依赖于物理活动,不受可能产生的最终报表的影响。

-
主键:
- 通常为复合主键,由多个外键组合,唯一标识一条记录(例如 订单ID + 产品ID。)。
-
外键:
- 连接维度表的字段,提供事实表记录的上下文(如时间ID、产品ID、客户ID)。
-
度量值:
- 存储可聚合的指标数据(如销售额、订单数量、库存量)。
-
粒度:
- 每条记录代表的业务事件或过程的最小单位(如每笔订单的每个商品)。
| 字段名 | 类型 | 描述 |
|---|---|---|
fact_id | INT | 主键 |
time_id | INT | 时间维度外键 |
product_id | INT | 产品维度外键 |
customer_id | INT | 客户维度外键 |
sales_amount | DECIMAL | 销售金额 |
sales_quantity | INT | 销售数量 |
Tip:事实表也可包含可选的退化维度键和日期/时间戳。(退化维度,在专栏里维度表技术基础里有讲~)
2.2.2 可加、半可加、不可加事实
事实表中的数字度量可划分为三类:
| 类别 | 定义 | 示例 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| 可加事实 | 在所有维度上都可以直接求和的度量值。 | 销售金额、销售数量、成本 | 适用于跨时间、产品、客户等维度的总量分析。 | 无需额外计算逻辑,直接进行求和操作即可。 |
| 半可加事实 | 只能在某些维度上求和,而在其他维度(通常是时间维度)上不能求和。 | 库存量、账户余额、银行存款 | 时间快照、状态监控场景,例如监控某日的库存或余额状态。 | 时间维度上不能直接求和,需通过取最近值或计算变化量等方式分析。 |
| 不可加事实 | 在所有维度上都无法直接求和的度量值,通常是比率或衍生指标。 | 利润率、平均单价、转化率 | 适用于分析比率、平均值或需要权重处理的业务场景,例如分析效率。 | 必须结合上下文设计加权平均、除法等逻辑,不能通过直接聚合获得结果。 |
| 类别 | 示例字段名 | 示例描述 | 是否可跨时间维度求和 | 处理方法 |
|---|---|---|---|---|
| 可加事实 | sales_amount | 记录销售金额,例如一笔订单的总金额。 | 是 | 直接使用 SUM(sales_amount) 进行求和即可。 |
| 可加事实 | sales_qty | 记录销售数量,例如商品的销售件数。 | 是 | 可按时间、商品、客户等维度聚合计算总量。 |
| 半可加事实 | stock_qty | 记录某一时间点的库存量,例如每天的库存快照。 | 否 | 取最新时间点的值或计算时间点之间的变化量。 |
| 半可加事实 | account_bal | 记录某一时间点的账户余额,例如每天的账户快照。 | 否 | 取最后一个时间点的余额作为有效值。 |
| 不可加事实 | profit_margin | 记录利润率,例如单个商品的利润率。 | 否 | 按比率的定义公式重新计算(如总利润/总收入)。 |
| 不可加事实 | avg_price | 记录平均单价,例如按订单计算的商品平均单价。 | 否 | 通过加权计算重新求值(如总金额/总数量)。 |
2.2.3 事实表中的空值
-
事实表中可以存在空值度量(所有聚集函数sum、count等都可针对空值事实计算)。
-
但是事实表中的外键不能存在空值,因为它们是维度表与事实表之间的关联桥梁。空值的外键意味着事实表中的记录没有关联到任何有效的维度数据,无法确保确保数据的完整性和一致性(引发数据质量问题)。

2.2.4 事务事实表(Transactional Fact Table)
事务事实表记录的是单个业务事务或事件的详细信息,每条记录代表一个独立的操作,如一次购买、一次交易或一次订单等。数据粒度通常非常细,每一行记录都是一个具体的事务。

- 粒度细:每条记录表示一个单独的事件或操作。
- 数据量大:由于记录详细的事务,数据量较大,且随着业务发展不断增加。
- 高更新频率:事务数据通常在操作发生时实时更新。
- 适用于实时或近实时分析:事务事实表能提供详细的业务过程数据,用于监控和分析业务活动。
| 字段名 | 描述 |
|---|---|
transaction_id | 事务ID(唯一标识) |
customer_id | 客户ID |
product_id | 产品ID |
time_id | 时间ID(外键) |
quantity | 销售数量 |
sales_amount | 销售金额 |
payment_status | 付款状态 |
2.2.5 周期快照事实表(Periodic Snapshot Fact Table)
周期快照事实表记录在特定时间点或时间段内的业务状态,通常会在某个固定时间间隔(如每天、每周或每月)进行快照。

每条记录通常代表某个周期结束时的业务状态,体现的是在该时间点的“快照”信息。
- 粒度较粗:每条记录代表一个周期的业务状态,而不是单个事务。
- 数据量较小:与事务事实表相比,周期快照事实表记录的数量较少,因为它仅记录周期性汇总的业务状态。
- 周期性更新:快照表通常定期(如每天、每月)更新,更新频率较低。
- 适用于趋势分析和汇总:周期快照表非常适合用于分析业务在特定时间点的状态变化,例如月度销售趋势、客户活跃度变化等。
| 字段名 | 描述 |
|---|---|
snapshot_date | 快照日期 |
customer_id | 客户ID |
total_sales | 总销售金额 |
total_quantity | 总销售数量 |
total_orders | 总订单数量 |
2.2.6 累计快照事实表(Cumulative Snapshot Fact Table)
累计快照事实表记录的是某个度量数据(如库存数量、账户余额等)的累积变化情况。与周期快照表不同,累计快照表记录的是从一个起始点开始,随时间积累变化的数据状态。这种表适用于需要持续积累的度量数据,如库存、客户余额、累计销售等。

- 粒度较粗:每条记录通常表示某个特定时间点的累计度量数据。
- 持续更新:与周期快照表不同,累计快照表在每次数据更新时都会进行累积。它不会丢失先前的累积数据,而是随着时间推移不断更新。
- 适用于长期趋势分析:累计快照表能够帮助跟踪业务的长期变化,如追踪某个客户的累计购买金额、账户余额变化等。
| 字段名 | 描述 |
|---|---|
snapshot_date | 快照日期 |
account_id | 账户ID |
balance | 累计余额 |
total_deposit | 累计存款 |
total_withdrawal | 累计取款 |
- 每条记录表示某个时间点的账户余额,包括从账户创建到该日期的所有存款和取款的累计情况。
| 特性 | 事务事实表 | 周期快照事实表 | 累计快照事实表 |
|---|---|---|---|
| 粒度 | 细粒度,每个事件或事务一条记录 | 粗粒度,按周期(如日、月、年)记录状态 | 粗粒度,按累积数据(如累计销售额)记录 |
| 数据量 | 大,随时间增加,记录每个事务 | 相对较小,通常按周期记录数据 | 适中,数据随着累计情况不断增长 |
| 更新频率 | 高,实时或近实时更新 | 低,定期(如每日、每月)更新 | 持续更新,随着业务过程变化而更新 |
| 适用场景 | 详细的业务过程分析,如订单追踪 | 趋势分析、月度或季度报告等 | 长期数据跟踪,如账户余额、累计销售等 |
| 示例 | 每一笔订单的详细信息 | 月度销售汇总数据 | 客户账户余额的累计变化 |
整理不易 列位点赞收藏关注多多支持🤣🤣🤣~
相关文章:
数据仓库工具箱—读书笔记02(Kimball维度建模技术概述02、事实表技术基础)
Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…...
SAP ABAP-日期格式问题 SAP内部错误,反序列化JSON字符串时发生异常 值 20241215 不是根据 ABAP 的 XML 格式的有效日期
SAP ABAP-日期格式问题 SAP内部错误,反序列化JSON字符串时发生异常 值 20241215 不是根据 ABAP 的 XML 格式的有效日期 在SAP内部用 YYYYMMDD没有问题 外部传入参数...
Linux-ubuntu点LED灯C语言版
一,C语言点灯 1.寄存器配置 设置为SVC模式,复用寄存器设置GPIO1-IO003,设置电气属性,设置为输出模式。 2.软件 汇编语言对模式设置,并且将堆栈指针指向主程序: .global _start_start: /*设置为svr模式 */mrs …...
ASP.NET|日常开发中数据集合详解
ASP.NET|日常开发中数据集合详解 前言一、数组(Array)1.1 定义和基本概念1.2 数组的操作 二、列表(List<T>)2.1 特点和优势2.2 常用操作 三、字典(Dictionary<K, V>)3.1 概念和用途…...
Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架
Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架 Pytest BDD vs Behave:选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave:关键区别Pytest BDD vs Behave:最佳应用场景结…...
Unity3D Shader变体自定义组合压缩方案详解
前言 在Unity3D中,Shader变体(Shader Variants)是指根据不同条件生成的Shader版本。这些条件可以包括材质属性、光照模型、阴影选项、渲染队列、纹理类型等。Shader变体允许开发者为同一Shader提供多种实现方式,以满足不同的渲染…...
QT使用promoted后样式(setStyleSheet)不生效问题解决
1.理解promoted(提升)在 Qt 中的概念 在 Qt Designer 中,“提升(Promoted)” 是一种机制,它允许你使用自定义的部件类来替代标准的 Qt 部件类。这在你已经创建了一个从标准 Qt 部件(如QListWid…...
Vue3有哪些好用的处理大数据量虚拟表格组件呢?
在 Vue 3 中,处理大数据量的虚拟表格(Virtual Table)通常需要一个专门的组件或库来优化渲染性能,避免一次性渲染过多的 DOM 元素。以下是一些常用的虚拟表格组件,它们可以帮助你有效处理大数据量: 1. Vue …...
Java学习教程,从入门到精通,Java LinkedList(链表)语法知识点及案例代码(62)
Java LinkedList(链表)语法知识点及案例代码 一、LinkedList概述 LinkedList是Java集合框架中的一个类,位于java.util包中。它实现了List、Deque、Queue等接口,提供了链表数据结构的实现。链表是一种线性数据结构,其…...
设计模式——Singleton(单例)设计模式
摘要 本文介绍了单例设计模式的概念、实现和应用场景。单例模式确保某个类只有一个实例,节省资源并提供全局访问点。文章详细解释了单例模式的实现要素,包括私有构造方法、静态实例和公共静态方法,并探讨了其在数据库连接池、日志记录器和配…...
深入理解 CSS 文本换行: overflow-wrap 和 word-break
前言 正常情况下,在固定宽度的盒子中的中文会自动换行。但是,当遇到非常长的英文单词或者很长的 URL 时,文本可能就不会自动换行,而会溢出所在容器。幸运的是,CSS 为我们提供了一些和文本换行相关的属性;今…...
Java-27 深入浅出 Spring - 实现简易Ioc-03 在上节的业务下手动实现IoC
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
kubernetes学习-使用metrics-server监控集群资源和查看日志
kubernetes学习-使用metrics-server监控集群资源和查看日志 一 、简介二、应用场景三、部署四、查看日志 一 、简介 Metrics Server 是一个用于 Kubernetes 集群的监控工具,它用于收集、存储和提供关于集群中各种资源的度量数据。Metrics Server 是 Kubernetes 中一…...
解决 Git Permission denied 问题
前言 push项目时出现gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.出现这个问题表示你在尝试将本地代码推送到GitHub时,没有提供…...
CCNP_SEC_ASA 第三天作业
实验需求: ASA 使用列表放行 Outside 路由器到 DMZ 路由器的 WWW 流量并拒绝 Telnet 流量,当放行和拒绝流量匹配后产生日志通告。 提示:需要使能 ASA的日志功能和 DMZ路由器的 HTTP功能。 设备配置: ##此处展示各设备的配置&am…...
TypeError: Cannot read properties of null (reading ‘ce‘)
vue项目本地跑不起来,但是build之后能运行,本地报错 是因为你的vue版本不对,你的package可能是这样写的 这个表示你允许你的npm安装vue3的任意版本,但是build是按照这个版本来的,所以build之后能运行,本地运…...
AdminJS - 集成 MySQL 的现代化管理面板开发指南
AdminJS - 集成 MySQL 的现代化管理面板开发指南 MySQL 集成配置 首先需要安装必要的依赖: npm install adminjs adminjs/express express npm install adminjs/sequelize sequelize mysql2基础配置示例 const AdminJS require(adminjs) const AdminJSExpress …...
上传文件(vue3)
使用el-upload 先上传到文件服务器,生成url 然后点击确定按钮: 保存数据 <template><el-dialog top"48px" width"500" title"新增协议" :modelValue"visible" close"handleClose()">…...
【Win10 环境vscode配置boost】
文章目录 Boost exe版本windows环境安装vscode配置安装测试总结 Boost exe版本windows环境安装 这里不介绍boost源码安装,请自行网络搜索。本文要介绍的是window下单c文件(cpp),调用boost库的执行配置。不涉及多文件。 安装文件下…...
中间件 redis安装
redis官网地址:Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1,远程下载redis压缩包,或去官网下载:Downloads …...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
