当前位置: 首页 > news >正文

数据仓库—维度建模—事实表设计

事实表

事实表是数据仓库中的核心表,用于记录与业务过程相关的事实信息,是进行数据分析和挖掘的主要数据来源。

在ER模型中抽象出了有实体、关系、属性三种类别,在现实世界中,每一个操作型事件,基本都是发生在实体之间的,伴随着这种操作事件的发生,会产生可度量的值,而这个过程就产生了一个事实表,存储了每一个可度量的事件,所以事实表本质上是反映一个个事件的,例如下单事件,度量就是下单的金额,事实表的特点就是增长迅速,且主要以数值进行记录,或者是以其他信息进行记录

这里补充一下,其实一个操作事件往往有多个维度,举个例子,下单操作有下单行为的主体也就是用户,下单的对象也就是商品,还有下单的时间等,这些都是不同的维度表

在构建数据仓库总线矩阵完成后,可着手事实表和维度表的设计,关于总线矩阵可以参考数仓建模—总线矩阵

数仓总线矩阵里每个业务过程都会生成至少一张事实表(识别业务过程的本质就是识别要构建的事实表),因为有可能一个原子事件涉及多张表的情况。同时,因上游业务系统老旧,表设计水平、使用场景等因素,或并不是都是标准3NF范式设计,将多个业务过程事件发生存储在一张表的情况,对于此种情况做事实表设计时,根据使用场景可能会进行表拆分考虑。

  1. 对于单事务事实表,一个业务过程建立一个事实表,只反映一个业务过程的事实;

  2. 对于多事务事实表,在同一个事实表中反映多个业务过程。

  3. 还有一种就是一个业务过程有多个事实表

多个业务过程是否放到同一个事实表中,首先需要分析不同业务过程之间的相似性和业务源系统。还会考虑使用场景、数据共同项、数据产出时效、数据逻辑变动频率、数据量、数据安全性等因素,再决定是否适合放到同一个事务事实表中。

事实表设计是需识别业务过程、探查数据粒度、维度、事实等几个步骤,再根据数据粒度,数据更新方式、数据量大小和使用场景等因素判断是否进行多业务过程或表进行合并,再选择合适的事实表类型进行模型设计

数据同步方式

在进行表设计之前需要进行数据探查,如数据粒度、字段是否在使用、字段是否为空、记录是否完整、数据更新方式,即粒度更新方式,所谓粒度,就是表中一行记录代表什么,即一个主体何时何地为何发生了什么事件。再根据数据量大小、不同粒度更新方式,可分为以下三种增量、全量和合并数据同步方式:

  • 增量:流水表只追加,记录无更新无删除,数据量小可以全量,数据量大一般情况是增量抽取方式(考虑未来数据量的变化)

  • 全量:存在数据记录更新 其实这就是快照事物事实表

  • 合并:存在数据记录删除(合并ETL工具集成可直接使用,不集成抽取后处理也行)

对于无更新无删除记录流水表使用增量、全量都可以,可依据数据量大小来选,因为增量表分区表当成全量表使用,分区条件限定为从历史到当前;对于存在数据记录更新的,可使用全量抽取,否则会导致数据抽取不全或数据存在重复;对于数据记录删除的,需合并之前历史数据,否则会数据丢失,无法反应历史变化的特性。

事实表的度量

  • 可加

可以进行任意维度下的累加

  • 半可加

每个学生的各个科目的成绩是可加的,但是全班的各个科目进行累加是没有意义的

不可加

需要注意不可加的在任何情况下都是不可加的,比例或者比率是只针对该行有意义,直接累加无意义

这个其实是比较常见的一种情况,但是容易被忽略,也就是说不是所有的事实表都是可度量的,也就是记录了数值,例如用户的发言、评论等等。

事实表的设计

在进行事实表设计或进行数仓模型评审是尽量可能将分散在各个业务系统中相同或相似的业务过程进行整合,但也存在这个分拆的设计,例如我们的业务系统的表设计的并不好,将多个业务过程放在了一张表里,这个时候我们可能就需要做拆

http://www.lryc.cn/news/340298.html

相关文章:

  • 《系统架构设计师教程(第2版)》第9章-软件可靠性基础知识-05-软件可靠性测试
  • uni-app vue3 setup 如何使用 onShow
  • linux学习:进程(新建+运行某文件+退出处理函数+等待)
  • Leetcode. 12 整数转罗马数字
  • 【uniapp】request请求函数封装,token、成功、失败等
  • 0基础如何入门编程?
  • Go 单元测试基本介绍
  • uniapp 上传视频到阿里云之后回显视频获取视频封面
  • 使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题
  • Hadoop入门学习路线
  • Python中的设计模式与最佳实践【第166篇—设计模式】
  • Python赋能AI数据分析开启人工智能新时代
  • TP5使用group报错:1055 Expression #1 of SELECT list is not in GROUP
  • SQL-DML数据操纵语言(Oracle)
  • springboot+axios传参问题
  • (BERT蒸馏)TinyBERT: Distilling BERT for Natural Language Understanding
  • 【数据结构|C语言版】双向链表
  • 适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]
  • 久菜盒子|留学|推荐信|活动类|改性伽马-三氧化二铝催化剂上甲醇制备二甲醚的研究项目
  • Java项目如何使用EasyExcel插件对Excel数据进行导入导出
  • python标准库常用方法集合
  • 智谱AI通用大模型:官方开放API开发基础
  • 单片机家电产品--OC门电路
  • gcc常用命令指南(更新中...)
  • 【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵,网络攻击,流量异常【3】
  • 两步解决 Flutter Your project requires a newer version of the Kotlin Gradle plugin
  • ArcGIS加载的各类地图怎么去除服务署名水印
  • AttributeError: module ‘cv2.face’ has no attribute ‘LBPHFaceRecognizer_create’
  • 配置路由器实现互通
  • Google Guava第五讲:本地缓存实战及踩坑