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

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

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

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.mfbz.cn/a/713163.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

13.docker registry(私有仓库)

docker registry(私有仓库) 1.从公有仓库中下载镜像比较慢 ,比如docker run执行一个命令假设本地不存在的镜像,则会去共有仓库进行下载。 2.如果要是2台机器之间进行拷贝,则拷贝的是完整的镜像更消耗空间。 3.如果1个…

python数据分析-糖尿病数据集数据分析预测

一、研究背景和意义 糖尿病是美国最普遍的慢性病之一,每年影响数百万美国人,并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病,其中个体失去有效调节血液中葡萄糖水平的能力,并可能导致生活质量和预期寿命下降。。。。 …

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 服务版本、客户端版本都为: 19.03.14-3.el7 yum -y install docker-ce-19.03.14-3.e…

【python】tkinter GUI开发: 多行文本Text,单选框Radiobutton,复选框Checkbutton,画布canvas的应用实战详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【Spine学习06】之IK约束绑定,制作人物待机动画,图表贝塞尔曲线优化动作

引入IK约束的概念: 约束目标父级 被约束骨骼子集 这样理解更好,约束目标可以控制被约束的两个骨骼运作 IK约束绑定过程中呢,如果直接绑定最下面的脚掌骨骼会发生偏移,所以在开始处理IK之前,需要先设置一个ROOT结点下的…

采煤vr事故灾害应急模拟救援训练降低生命财产损失

在化工工地,设备繁多、环境复杂,潜藏着众多安全隐患,稍有不慎便可能引发安全事故。为了保障工地的安全,我们急需一套全面、高效的安全管理解决方案。web3d开发公司深圳华锐视点研发的工地安全3D模拟仿真隐患排查系统,正…

hugo-magic主题使用教程(一)

前提条件 以下教程以windows10为例操作终端使用git bash魔法上网的前提下 下载hugo https://github.com/gohugoio/hugo/releases/download/v0.127.0/hugo_extended_0.127.0_windows-amd64.zip解压到任意目录,然后将目录添加到系统环境变量 如图 (windows)打开cmd 输入 hugo …

Superset 二次开发之Git篇 git cherry-pick

Cherry-Pick 命令是 Git 中的一种功能,用于将特定的提交(commit)从一个分支应用到另一个分支。它允许你选择性地应用某些提交,而不是合并整个分支。Cherry-Pick 非常适合在需要将特定更改移植到其他分支时使用,例如从开…

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

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

单调栈(续)、由斐波那契数列讲述矩阵快速降幂技巧

在这里先接上一篇文章单调栈,这里还有单调栈的一道题 题目一(单调栈续) 给定一个数组arr, 返回所有子数组最小值的累加和 就是一个数组,有很多的子数组,每个数组肯定有一个最小值,要把所有子…

享元和代理模式

文章目录 享元模式1.引出享元模式1.展示网站项目需求2.传统方案解决3.问题分析 2.享元模式1.基本介绍2.原理类图3.外部状态和内部状态4.类图5.代码实现1.AbsWebSite.java 抽象的网站2.ConcreteWebSite.java 具体的网站,type属性是内部状态3.WebSiteFactory.java 网站…

《C语言》动态内存管理

文章目录 一、动态内存分配二、关于动态内存开辟的函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误1、对NULL指针的解引用操作2、对动态开辟空间的越界访问3、对非动态开辟内存使用free释放4、释放free释放一块动态开辟的内存的一部分5、对同一块动态内存多…

Ubuntu基础-VirtualBox安装增强功能

目录 零. 前言 一. 安装 1.点击安装增强功能 2.点击光盘图标 3.复制到新文件夹 4.运行命令 5.重启系统 6.成果展示 二. 打开共享 1.共享粘贴 ​编辑2.共享文件夹 三.总结 安装步骤 打开共享粘贴功能: 打开共享文件夹功能: 零. 前言 在使用…

设计模式-代理模式Proxy(结构型)

代理模式(Proxy) 代理模式是一种结构型模式,它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址,负责将请求转发给代理类,并且可以在转发前后做一些处理 图解 角色 抽象主题(Subject&…

upload-labs第九关教程

upload-labs第九关教程 一、源代码分析代码审计::$DATA介绍 二、绕过分析特殊字符::$data绕过上传eval.php使用burpsuite抓包进行修改放包,查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submi…

抖音a_bogus,mstoken爬虫逆向补环境2024-06-15最新版

抖音a_bogus,mstoken爬虫逆向补环境2024-06-15最新版 接口及参数 打开网页版抖音,右键视频进入详情页。F12打开控制台筛选detail,然后刷新网页,找到请求。可以发现我们本次的参数目标a_bogus,msToken在cookie中可以获得&#xf…

无公网ip、服务器无法上网如何实现外网访问

在ipv4的大环境下,公网ip和车牌号一样抢手,一个固定公网ip价格非常昂贵,中小企业承担不起,也不愿意在上面投入;同时勒索病毒日益猖獗,企业信息化负责人为了保证数据安全性,干脆禁止服务器上外网…

分布式微服务: springboot底层机制实现

springboot底层机制实现 搭建SpringBoot底层机制开发环境ConfigurationBean会发生什么,并分析机制提出问题: SpringBoot 是怎么启动Tomcat, 并可以支持访问Controller源码分析: SpringApplication.run()SpringBoot的debug流程 实现SpringBoot底层机制[Tomcat启动分析 Spring容…

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据,通过文字搜索图片,Chroma 支持文字和图片,通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP(Contrastive Language-Image Pretraining&…

课设--学生成绩管理系统(一)

欢迎来到 Papicatch的博客 文章目录 🍉技术核心 🍉引言 🍈标识 🍈背景 🍈项目概述 🍈 文档概述 🍉可行性分析的前提 🍈项目的要求 🍈项目的目标 🍈…