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

news2025/1/15 13:03:19

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

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

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.coloradmin.cn/o/1827465.html

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

相关文章

正解 x86 Linux 内存管理

1,机器解析的思路 发现网络上大量的教程,多是以讹传讹地讲解 Linux 内存管理; 都是在讲: 逻辑地址 -> 线性地址 -> 物理地址 这个转换关系是怎么发生的。 上面这个过程确实是程序运行时地址的翻译顺序; …

Java课程设计:基于Javaweb的校园订餐系统

文章目录 一、项目介绍二、项目技术栈三、核心代码四、项目展示五、源码获取 一、项目介绍 在当今互联网高速发展的时代,大学校园内的学生生活正在发生着翻天覆地的变化。其中,校园内的餐饮服务无疑是亟需改革和创新的领域之一。 传统的校园食堂模式,往往存在就餐高峰时段拥挤…

[Cloud Networking] SPDY 协议

文章目录 1. 背景2. SPDY 之前3. SPDY 项目目标4. SPDY 功能特点4.1 SPDY基本功能4.2 SPDY高级功能 1. 背景 TCP是通用的、可靠的传输协议,提供保证交付、重复抑制、按顺序交付、流量控制、拥塞避免和其他传输特性。 HTTP是提供基本请求/响应语义的应用层协议。 不…

ubuntu 22.04下载和安装

ubuntu镜像: https://www.releases.ubuntu.com/22.04/ 然后下载vmwareworkstation16 密钥 ZF3R0-FHED2-M80TY-8QYGC-NPKYF

fiddler打开后,requests无法使用

Fiddler实用小技巧 错误情况 打开fiddler后,requests无法请求 requests.exceptions.ProxyError: HTTPSConnectionPool(hosth5api.m.taobao.com, port443): 说明 其实这是一个很小的坑,确也是一个很常见的坑。 在打开fiddler后,根据fiddle…

Linux笔记--ubuntu文件目录+命令行介绍

文件目录 命令行介绍 当我们在ubuntu中命令行处理位置输入ls后会显示出其所有目录,那么处理这些命令的程序就是shell,它负责接收用户的输入,并根据输入找到其他程序并运行 命令行格式 linux的命令一般由三部分组成:command命令、…

Cheat Engine CE v7.5 安装教程(专注于游戏的修改器)

前言 Cheat Engine是一款专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。 一、下载地址 下载链接:http://dygod/source 点击搜索&…

微信小程序毕业设计-实验室管理系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

为什么用SDE(随机微分方程)来描述扩散过程【论文精读】

为什么用SDE(随机微分方程)来描述扩散过程【论文精读】 B站视频:为什么用SDE(随机微分方程)来描述扩散过程 论文:Score-Based Generative Modeling through Stochastic Differential Equations 地址:https://doi.org/10.48550/arXiv.2011.13…

读AI新生:破解人机共存密码笔记02进化

1. 人工智能的标准模型 1.1. 机器优化人类提供的固定目标 1.1.1. 是一条死胡同 1.1.1.1. 当你走进死胡同时,你最好掉头返回,找出走错的地方 1.2. 问题不在于我们可能无法做好构建人工智能系统的工作&…

LeetCode --- 401周赛

题目列表 3178. 找出 K 秒后拿着球的孩子 3179. K 秒后第 N 个元素的值 3180. 执行操作可获得的最大总奖励 I 3181. 执行操作可获得的最大总奖励 II 一、找出K秒后拿着球的孩子 这题可以直接模拟,从前往后,再从后往前走k次,最后直接返回…

小红书教程简化版,从0开始走向专业,小红书-主理人培养计划 (13节)

课程目录 1-小红书分析与拆解.mp4 2-小红书电商玩法.mp4 3-小红书基础信息设置10_1.mp4 4-小红书如何开店?.mp4 5-小红书店铺设置(1).mp4 5-小红书店铺设置.mp4 6-小红书笔记制作与产品发布.mp4 7-小红书运营的文案与标题.mp4 8-小红…

网络编程(二)TCP

一、TCP网络编程 网络编程模型: C/S模型:客户端服务器模型 优点: 客户端可以缓存一些数据,使用时直接在本地读取,无需每次重新下载; 由于客户端和服务器都是自己开发的,可以自定义协议 缺点&a…

数据结构C语言版:顺序表基本操作的实现

参考教材:数据结构C语言版(严蔚敏,吴伟民编著) 目录 线性表的基本操作: 1:线性表L的初始化(参数用引用) 2:销毁线性表L 3:清空线性表L 4:求线性表L的长度 5&#xf…

⌈ 传知代码 ⌋【算法】实体关系抽取

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

【内存管理之堆内存】

1.栈上的基元 2.栈上的聚合对象 3.手动分配和释放 4.分配堆内存 5.数组内存分配和释放 6.数组内存分配 7.不要使用野指针 8.黑暗时代

Windows如何找回永久删除的文件?完整教程看完即会!

可以找回永久删除的文件? 你是否也在Windows 10中永久删除过文件?什么是永久删除?通常有5种方法可以永久删除文件: 正常删除文件,然后在回收站中再次删除。使用命令提示符:“del”删除文件。使用“ShiftD…

【设计文档】软件项目详细设计说明书案例(套用模板Word)

1引言 1.1编写目的 1.2项目背景 1.3参考材料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统…

【PL理论】(26) 内存管理:C语言实现内存管理的方式 | 栈帧的分配和释放 | C/C++ 手动内存管理

💭 写在前面:在前面的章节中,语言的语义只分配了新的内存位置,我们没有讨论内存位置的释放。在实际的语言中,内存位置在执行过程中会被不断地分配和释放。下面的章节,我们将讨论编程语言的这种内存管理&…

[大模型]XVERSE-7B-chat WebDemo 部署

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型(Large Language Model),参数规模为 70 亿,主要特点如下: 模型结构:XVERSE-7B 使用主流 Deco…