维度建模中的事实表设计原则

维度建模是一种数据仓库设计方法,其核心是围绕业务过程建立事实表和维度表。事实表主要存储与业务过程相关的度量数据,而维度表则描述这些度量数据的属性。

以下是设计事实表时需要遵循的几个重要原则,来源于《维度建模》那本书上,结合实际例子进行了说明。

image.png

目录

    • 原则一:尽可能包含所有与业务过程相关的事实
      • 示例1:订单下单事实表
    • 原则二:只选择与业务过程相关的事实
      • 示例2:支付事实表
    • 原则三:分解不可加性事实为可加的组件
      • 示例3:处理不可加性事实
    • 原则四:在选择维度和事实之前必须先声明粒度
      • 示例4:声明粒度
    • 原则五:在同一个事实表中不能有多种不同粒度的事实
      • 示例5:同一事实表中不同粒度的处理
    • 原则六:事实的单位要保持一致
      • 示例6:保持单位一致
    • 原则七:对事实的null值要处理
      • 示例7:处理null值
    • 原则八:使用退化维度提高事实表的易用性
      • 示例8:使用退化维度

原则一:尽可能包含所有与业务过程相关的事实

在设计事实表时,应尽量包含所有与业务过程相关的事实。即使存在冗余,由于事实通常为数字型,带来的存储开销不会很大。例如,在销售业务的事实表中,应包含销售金额、销售数量、折扣金额等与销售过程密切相关的所有事实。

示例1:订单下单事实表

该表记录订单下单过程中的相关事实。

CREATE TABLE OrderFact (OrderID INT PRIMARY KEY,ProductID INT,CustomerID INT,OrderDate DATE,OrderAmount DECIMAL(10, 2),DiscountAmount DECIMAL(10, 2),Quantity INT
);

原则二:只选择与业务过程相关的事实

在选择事实时,应注意只选择与当前业务过程相关的事实。例如,在订单下单的业务过程事实表中,不应包含支付金额这种与支付业务过程相关的事实。这样可以确保每个事实表只记录一个业务过程的度量数据,避免混淆。

示例2:支付事实表

该表记录支付过程中的相关事实。

CREATE TABLE PaymentFact (PaymentID INT PRIMARY KEY,OrderID INT,PaymentDate DATE,PaymentAmount DECIMAL(10, 2)
);

原则三:分解不可加性事实为可加的组件

对于不具备可加性条件的事实,需要将其分解为可加的组件。例如,订单的优惠率无法直接进行加总,因此应将其分解为订单原价金额和订单优惠金额两个事实存储在事实表中。这些可加的组件可以通过聚合操作进行加总,提供更灵活的分析能力。

示例3:处理不可加性事实

将订单优惠率分解为订单原价金额和订单优惠金额两个可加的事实。

CREATE TABLE OrderFact (OrderID INT PRIMARY KEY,ProductID INT,CustomerID INT,OrderDate DATE,OriginalPrice DECIMAL(10, 2),DiscountAmount DECIMAL(10, 2),Quantity INT
);

计算优惠价格时

  select (OriginalPrice - DiscountAmount) AS FinalPrice 

通过如上查询计算

原则四:在选择维度和事实之前必须先声明粒度

粒度用于确定事实表中一行所表示业务的细节层次,决定了维度模型的扩展性。在选择维度和事实之前必须先声明粒度,且每个维度和事实必须与所定义的粒度保持一致。设计事实表时,粒度定义得越细越好,建议从最低级别的原子粒度开始,因为原子粒度提供了最大限度的灵活性。例如,销售事实表的粒度可以定义为每个销售事务,而不是每月或每年的汇总数据。

示例4:声明粒度

粒度用于确定事实表中一行所表示业务的细节层次,定义得越细越好。以下示例展示了订单事务的粒度定义为每个订单项。

CREATE TABLE OrderItemFact (OrderItemID INT PRIMARY KEY,DiscountAmount DECIMAL(10, 2), Quantity INT
);

原则五:在同一个事实表中不能有多种不同粒度的事实

事实表中的所有事实需要与表定义的粒度保持一致,不同粒度的事实不能混在同一个事实表中。例如,机票支付成功事务事实表的粒度为票级,一个订单可以包含多张机票。因此,票支付金额和票折扣金额可以存储在同一个事实表中,而订单支付金额和订单票数则不适合存储在该表中,因为它们的粒度是订单级,与票级不一致。

示例5:同一事实表中不同粒度的处理

CREATE TABLE TicketPaymentFact ( 
TicketID INT PRIMARY KEY, 
OrderID INT, 
TicketPrice DECIMAL(10, 2), 
TicketDiscount DECIMAL(10, 2), 
PaymentDate DATE );

原则六:事实的单位要保持一致

对于同一事实表中的事实,其单位应保持一致。例如,订单原金额、订单优惠金额和订单运费金额这三个事实,应该统一使用元或分为单位,以便于后续的计算和分析。

示例6:保持单位一致

在创建事实表时,确保所有金额字段使用相同的单位(例如元)。

CREATE TABLE FinancialFact (TransactionID INT PRIMARY KEY,TransactionDate DATE,OriginalAmount DECIMAL(10, 2),DiscountAmount DECIMAL(10, 2),ShippingCost DECIMAL(10, 2),TotalAmount AS (OriginalAmount - DiscountAmount + ShippingCost) PERSISTED
);

原则七:对事实的null值要处理

在事实表中,对于度量值为null的情况,建议用零值填充。这是因为在数据库中,null对常用的数字型字段SQL过滤条件如大于、小于等操作都不生效。用零值填充可以避免这些问题,并简化查询操作。

示例7:处理null值

在插入数据时,用零值填充null值。

INSERT INTO OrderFact (OrderID, ProductID, CustomerID, OrderDate, OriginalPrice, DiscountAmount, Quantity)
VALUES (1, 101, 1001, '2024-06-01', 100.00, COALESCE(NULL, 0), 1);

原则八:使用退化维度提高事实表的易用性

在维度建模中,通常按照星形模型的方式设计事实表和维度表。

在大数据领域,为了减少用户查询时关联多个表的操作,可以在事实表中存储常用的维度信息,即使用退化维度。

例如,在销售事实表中,可以直接存储产品类别和客户地区等信息,而不是通过外键关联维度表。这种设计可以减少计算开销,提高查询效率。

示例8:使用退化维度

在销售事实表中直接存储产品类别和客户地区等信息,以减少查询时的表关联操作。

CREATE TABLE SalesFact (SalesID INT PRIMARY KEY,ProductID INT,ProductCategory VARCHAR(50),CustomerID INT,CustomerRegion VARCHAR(50),SalesDate DATE,SalesAmount DECIMAL(10, 2),DiscountAmount DECIMAL(10, 2),Quantity INT
);

综上所述,事实表的设计需要遵循以上原则,确保表中存储的数据准确、完整且易于分析。这些原则在实际应用中具有很强的指导意义,有助于构建高效、灵活的数据仓库。

大数据开发可以更好地理解和应用这些原则,提升数据仓库的设计质量和使用效率。

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

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

相关文章

Dictionary 字典

文章目录 一、什么是字典1.1 字典的创建方式 一、什么是字典 字典: 用来存储数据,与列表和元组不一样的是,字典以键值对的形式对数据进行存储,也就是 key 和 value。相当于 Java 中的 Map。 注意: 1、 key 的值不可重…

[C++][数据结构][AVL树]详细讲解

目录 1.AVL树的概念2.AVL树节点的定义3. AVL树的插入4.AVL树的旋转1.新节点插入较高左子树的左侧 -- 左左:右单旋2.新节点插入较高右子树的右侧 -- 右右:左单旋3.新节点插入较高左子树的右侧 -- 左右:先左单旋再右单旋4.新节点插入较高右子树…

基于System-Verilog点亮LED灯

文章目录 一、System-Verilog介绍1.1System-Verilog 二、简单的语法介绍2.1接口实例2.2全局声明和语句实例2.3时间单位和精度2.4用户定义的类型2.5 枚举类型 三、流水灯参考 一、System-Verilog介绍 1.1System-Verilog SystemVerilog是一种硬件描述和验证语言(HDV…

书生·浦语大模型实战营第二期作业五

1、开发机创建conda环境: 2、安装第三方库: 3、新建pipeline_transformer.py文件,并运行: 4、运行结果: 5、执行模型: 6、与大模型进行对话: 7、默认占有的显存: 8、--cache-max-en…

git删除已创建tag标签

前言 一不小心把tag标签名称复制错了&#xff0c;现将删除 1.删除本地标签 1.1.执行下面命令 git tag -d 1.5.2401161.5.240116是创建的tag标签名称 2.如果是删除远程的tag标签名称的话&#xff0c;看下面命令 2.1.删除远程标签 git push --delete origin <tagname>…

【博客719】时序数据库基石:LSM Tree的增删查改

时序数据库基石&#xff1a;LSM Tree的增删查改 LSM结构 LSM树将任何的对数据操作都转化为对内存中的Memtable的一次插入。Memtable可以使用任意内存数据结构&#xff0c;如HashTable&#xff0c;BTree&#xff0c;SkipList等。对于有事务控制需要的存储系统&#xff0c;需要在…

【MySQL基础随缘更系列】DML语句

文章目录 一、表记录操作-上1.1、DML概述1.2、插入记录 二、表记录操作-下2.1、更新记录2.2、删除记录 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &a…

用CloudCompare软件拟合点云中的圆柱体

用CloudCompare软件拟合点云中的圆柱体 软件下载 点击下面的链接&#xff0c;进入下载页面&#xff1a; 下载页面 然后根据需要选择下载合适的软件版本。 一般选择windows installer版&#xff0c;如图所示&#xff1a; 下载完成后&#xff0c;安装并打开软件。软件的默认语…

解决 kali 中使用 vulhub 拉取不到镜像问题

由于默认情况下&#xff0c;访问的镜像是国外的&#xff0c;而从 2023 年开始&#xff0c;docker 的镜像网站就一直访问不了&#xff0c;所以我们可以把镜像地址改成国内的阿里云镜像地址。 1、在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json 2、在…

docker 简单在线安装教程

1、配置阿里镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 2、指定版本安装docker 本次制定安装 docker 服务版本、客户端版本都为&#xff1a; 19.03.14-3.el7 yum -y install docker-ce-19.03.14-3.e…

ffmpeg实现视频播放 ----------- Javacv

什么是Javacv和FFmpeg&#xff1f; Javacv是一个专门为Java开发人员提供的计算机视觉库&#xff0c;它基于FFmpeg和Opencv库&#xff0c;提供了许多用于处理图 像、视频和音频的功能。FFmpeg是一个开源的音视频处理工具集&#xff0c;它提供了用于编码、解码、转换和播放音视频…

Unity Meta Quest 开发:与 Unity 的 UI 系统进行交互

文章目录 &#x1f4d5;教程说明&#x1f4d5;教程内容概括&#x1f4d5;添加玩家物体&#x1f4d5;添加 Canvas 物体和 EventSystem 物体&#x1f4d5;修改 Canvas 组件的 Render Mode&#x1f4d5;在 Canvas 上搭建 UI 面板&#x1f4d5;利用 Interaction SDK 的 Quick Actio…

英伟达与斯坦福携手,打造未来全息XR眼镜:头带时代的终结

在XR(扩展现实)技术的演进过程中,一个显著的挑战在于如何平衡设备的便携性与视觉体验。传统的XR设备由于需要厚重的头带固定光学器件和显示器,不仅增加了体积,还为用户带来了社交上的不便。然而,随着英伟达与斯坦福大学戈登韦茨斯坦教授领导的研究团队的合作,这一难题似…

python包管理器--- pip、conda、mamba的比较

1 pip 1.1 简介 pip是一个 Python 的包&#xff08;Package&#xff09;管理工具&#xff0c;用于从 PyPI 安装和管理 Python 标准库之外的其他包&#xff08;第三方包&#xff09;。从 Python 3.4 起&#xff0c;pip 已经成为 Python 安装程序的一部分&#xff0c;也是官方标准…

IO流及字符集

IO流 作用&#xff1a; 用于读写文件中的数据 分类&#xff1a; 图来自黑马程序员网课 纯文本文件&#xff1a;Windows自带的记事本打开能读懂的文件&#xff0c;word excel不是纯文本文件 图来自黑马程序员网课 FileOutputStream: 操作本地文件的字节输出流&#xff0c;可…

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法&#xff0c;允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket&#xff0c;socket是…

vue3:实现图片放大浏览功能组件

两种实现方式&#xff1a; 1.将原本的盒子与img标签放大至全屏浏览。 2.新建一个div和img标签进行全屏浏览。这样不会改变布局。 第一种&#xff1a; 效果&#xff1a; 组件代码&#xff1a; <template><div :class"isScreen ? fullImg : norImg">…

Confluence是否免费?你需要知道的都在这里!

根据Atlassian官方信息&#xff0c;可以确定的是 Confluence 并不免费&#xff0c;但为10人以下团队提供了免费版本。免费版可以使用不限量的页面、空间&#xff0c;但只有2GB的存储空间和3个活动白板。但国内有不少公司通过使用破解版的方式来免费使用Cofluence。下面本文将详…

【什么!Grok记录被打破了】坏消息不是Meta的 llama3 400,好消息是Nvidia发布的Nemotron-4 340B且支持开源

Nvidia 发布了开创性的开放模型系列 “Nemotron-4 340B”&#xff0c;再次巩固了其作为人工智能创新领域无可争议的领导者的地位。这一发展标志着人工智能行业的一个重要里程碑&#xff0c;因为它使各行各业的企业能够创建功能强大的特定领域 LLM&#xff0c;而无需大量昂贵的真…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例&#xff1a;监听网络状态变化 2.2. 自定义广播示例&#xff1a;发送自定义广播 2.3. 有序广播示例&#xff1a;有序广播 2.4. …