维度建模与数据仓库设计:理论与实践案例

文章目录

    • 定义
    • 案例:零售销售数据仓库
    • 实践
      • 创建维度表
      • 创建事实表
      • 插入维度表数据
      • 插入事实表数据
      • 增改查

定义

维度建模是一种用于数据仓库设计的技术,它的目标是使数据库结构更加直观,易于理解和使用,特别是对于那些进行数据查询和报告的非技术用户。它主要包括两个核心概念:事实表和维度表。

  • 事实表:这是数据仓库的核心,用于存储度量或业务过程的量化数据。例如,一个零售业务的事实表可能包含每笔销售的总额、数量和时间等信息。
  • 维度表:这些表包含描述性信息,用于“维度化”事实表中的量化数据。它们帮助用户理解事实表中的数据。继续上述例子,维度表可能包括客户信息、产品信息、商店信息等,每个维度表都与事实表通过外键关联。

案例:零售销售数据仓库

假设我们要为一家零售商建立数据仓库。在这个例子中,我们可能会有:

事实表:销售事实

  1. 销售ID
  2. 产品ID (外键,连接到产品维度表)
  3. 顾客ID (外键,连接到顾客维度表)
  4. 商店ID (外键,连接到商店维度表)
  5. 销售日期 (外键,连接到时间维度表)
  6. 销售金额
  7. 销售数量

维度表:产品维度

  1. 产品ID
  2. 产品名称
  3. 产品类别
  4. 产品价格

维度表:顾客维度

  1. 顾客ID
  2. 顾客姓名
  3. 顾客地址
  4. 顾客类别

维度表:商店维度

  1. 商店ID
  2. 商店名称
  3. 商店位置
  4. 商店类型

维度表:时间维度

  1. 日期
  2. 季度

在这个例子中,事实表提供了可度量的业务过程(例如,每笔销售的金额和数量),而维度表则提供了理解这些度量所需的上下文(例如,销售发生在哪个商店,由哪个顾客进行,涉及哪个产品)。通过这种方式,维度建模帮助用户以直观的方式理解和分析复杂的业务数据。

实践

创建维度表

产品维度表

CREATE TABLE test.DimProduct (ProductID INT PRIMARY KEY,ProductName VARCHAR(255),Category VARCHAR(255),Price DECIMAL(10, 2)
);

顾客维度表

CREATE TABLE test.DimCustomer (CustomerID INT PRIMARY KEY,CustomerName VARCHAR(255),Address VARCHAR(255),CustomerType VARCHAR(255)
);

商店维度表

CREATE TABLE test.DimStore (StoreID INT PRIMARY KEY,StoreName VARCHAR(255),Location VARCHAR(255),StoreType VARCHAR(255)
);

时间维度表

CREATE TABLE test.DimTime (DateKey DATE PRIMARY KEY,Day INT,Month INT,Quarter INT,Year INT
);

创建事实表

销售事实表

CREATE TABLE test.FactSales (SaleID INT PRIMARY KEY,ProductID INT,CustomerID INT,StoreID INT,DateKey DATE,Amount DECIMAL(10, 2),Quantity INT,FOREIGN KEY (ProductID) REFERENCES DimProduct(ProductID),FOREIGN KEY (CustomerID) REFERENCES DimCustomer(CustomerID),FOREIGN KEY (StoreID) REFERENCES DimStore(StoreID),FOREIGN KEY (DateKey) REFERENCES DimTime(DateKey)
);

插入维度表数据

向产品维度表插入数据

INSERT INTO test.DimProduct (ProductID, ProductName, Category, Price) VALUES
(1, '苹果手机', '电子产品', 5000.00),
(2, '三星电视', '电子产品', 3000.00),
(3, '联想笔记本', '电子产品', 4500.00);select * from test.DimProduct;

如下:
在这里插入图片描述
向顾客维度表插入数据

INSERT INTO test.DimCustomer (CustomerID, CustomerName, Address, CustomerType) VALUES
(1, '张三', '北京市', '个人'),
(2, '李四', '上海市', '企业'),
(3, '王五', '广州市', '个人');select * from test.DimCustomer;

如下:
在这里插入图片描述
向商店维度表插入数据

INSERT INTO test.DimStore (StoreID, StoreName, Location, StoreType) VALUES
(1, '京东商城', '在线', '电商'),
(2, '苏宁易购', '在线', '电商'),
(3, '国美电器', '线下', '实体店');select * from test.DimStore;

如下:
在这里插入图片描述
向时间维度表插入数据

INSERT INTO test.DimTime (DateKey, Day, Month, Quarter, Year) VALUES
('2023-01-01', 1, 1, 1, 2023),
('2023-02-01', 1, 2, 1, 2023),
('2023-03-01', 1, 3, 1, 2023);select * from test.DimTime;

如下:
在这里插入图片描述

插入事实表数据

向销售事实表插入数据

INSERT INTO test.FactSales (SaleID, ProductID, CustomerID, StoreID, DateKey, Amount, Quantity) VALUES
(1, 1, 1, 1, '2023-01-01', 5000.00, 1),
(2, 2, 2, 2, '2023-02-01', 6000.00, 2),
(3, 3, 3, 3, '2023-03-01', 4500.00, 1);select * from test.FactSales ;

如下:
在这里插入图片描述

增改查

向产品维度表添加新产品

INSERT INTO test.DimProduct (ProductID, ProductName, Category, Price) VALUES
(4, '惠普打印机', '电子产品', 800.00);

从顾客维度表删除一位顾客
假设顾客ID为3的顾客不再是我们的客户,我们可以从顾客维度表中删除这条记录。

更新商店维度表中的商店信息
如果商店ID为3的商店更改了其名称,我们可以更新这条信息。

UPDATE test.DimStore SET StoreName = '新国美电器' WHERE StoreID = 3;

查询2023年第一季度的总销售额
这个查询将涉及联接事实表和时间维度表,以计算特定时间段内的总销售额。

SELECTSUM(test.FactSales.Amount) AS TotalSales
FROMtest.FactSales
JOINtest.DimTime ON test.FactSales.DateKey = test.DimTime.DateKey
WHEREtest.DimTime.Year = 2023 AND test.DimTime.Quarter = 1;

如下:
在这里插入图片描述

  • FROM FactSales: 这是查询的主表,我们从这个事实表开始。
  • JOIN DimTime ON FactSales.DateKey = DimTime.DateKey: 这里我们通过JOIN操作将FactSales表和DimTime表联接起来。联接的条件是FactSales.DateKey
  • DimTime.DateKey,意味着我们只关心那些在两个表中都有匹配日期的行。
  • WHERE DimTime.Year = 2023 AND DimTime.Quarter = 1: 这个条件进一步过滤结果,只包括2023年第一季度的数据。
  • SELECT SUM(FactSales.Amount) AS TotalSales: 最后,我们对联接后的数据进行汇总,计算总销售额。

查询特定顾客的购买历史
这个查询显示了顾客ID为1的顾客在不同时间购买的产品。

SELECTDimCustomer.CustomerName,DimProduct.ProductName,FactSales.DateKey,FactSales.Amount
FROMtest.FactSales
JOINtest.DimCustomer ON FactSales.CustomerID = DimCustomer.CustomerID
JOINtest.DimProduct ON FactSales.ProductID = DimProduct.ProductID
WHEREDimCustomer.CustomerID = 1;

如下:
在这里插入图片描述
在这个查询中,我们首先联接FactSales和DimCustomer,然后再将结果与DimProduct联接。最终的结果集包含了顾客姓名、产品名称、购买日期和购买金额,这些信息来自三个不同的表。

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

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

相关文章

【OpenCV】计算机视觉图像处理基础知识

目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Ca…

vue 用Nginx实现负载均衡

Nginx负载均衡的作用(相当于客户端的请求是发到Nginx上的,然后由Nginx决定到底调用哪台服务器): 在 .net core 中的具体实现步骤 1.在nginx官网上下载安装包,推荐稳定版; 建议1.18版本 2.下载完成后,到所在目录执行 nginx绿色图…

易点易动二维码巡检方案:提升企业巡检效率的智慧选择

在当今科技发达的时代,传统的纸质设备巡检方式已经无法满足企业管理的需求。纸质巡检方式存在诸多弊端,如巡检效率低、数据管理困难等问题。然而,随着易点易动二维码巡检方案的出现,企业可以迎来一种全新的巡检方式,极…

无需公网IP!Apache服务器本地部署与内网穿透实现公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

实战分析和精华总结:服务器端请求伪造SSRF漏洞数据劫持、复现、分析、利用及修复过程

实战分析和精华总结:服务器端请求伪造SSRF漏洞数据劫持、复现、分析、利用及修复过程。 SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以…

“丝路电商”与泛欧在线公共采购平台Peppol

近期上海商务委员会公布《关于在上海市创建“丝路电商”合作先行区的方案》(以下简称方案),方案中提出:“全面贯彻落实党的二十大精神,立足新发展阶段,完整、准确、全面贯彻新发展理念,加快构建…

React--引入第三方插件时,标签名是小写报错问题

报错信息 报错原因 1.组件名得大写 2.缺少 import 语句 解决方案 declare global{namespace JSX{interface IntrinsicElements {micro-app: any}} }

基于Python实现的滑动验证码自动识别工具源码

滑动验证码识别 今天的目标地址是字节的巨量纵横,目前东家是一家广告营销型的公司,专注于在各大平台投放信息流广告。巨量纵横为字节跳动的广告平台,用于管理推广账户。今天破解一下这个平台的登陆入口,为今后的数据爬取开个头。…

Go 程序编译过程(基于 Go1.21)

版本说明 Go 1.21 官方文档 Go 语言官方文档详细阐述了 Go 语言编译器的具体执行过程,Go1.21 版本可以看这个:https://github.com/golang/go/tree/release-branch.go1.21/src/cmd/compile 大致过程如下: 解析 (cmd/compile/internal/synt…

【数电笔记】06-码制

目录 说明: 二进制代码 1. 二 - 十进制码 2. 常用二 - 十进制代码表 2.1 例题 可靠性代码 1. 格雷码 2. 奇偶校验码 3. 8421奇偶校验码表 说明: 笔记配套视频来源:B站;本系列笔记并未记录所有章节,只对个人认…

SAP_ABAP_内表数据重复问题,解决思路

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读516次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/j…

ESP32-Web-Server编程-简单的照片浏览器

ESP32-Web-Server编程-简单的照片浏览器 概述 从本节开始我们开始制作一些有趣的多媒体 Web 的示例。 当你希望在网页上展示一些广告、照片,或者你的开发板带摄像头,能够采集一些图片,这时你希望可以通过手头的浏览器查看图片,…

第二证券:国际金价创新高 国内锂电企业有望加速出海

12月首个交易日,两市股指盘中弱势下探,午后止跌回升,沪指、创业板指翻红,北证50指数再度跳水。到收盘,沪指微涨0.07%报3031.64点,深成指跌0.07%报9720.57点,创业板指涨0.19%报1926.28点&#xf…

如何打印社保参保凭证

西安市: 陕西政务服务网: 个人服务 珠海市: 广东政务服务网: 用户登录 | 珠海市人力资源和社会保障网上服务平台 武汉市: 湖北政务服务网: 湖北政务服务网

vue: 线上项目element-ui的icon偶尔乱码问题

线上环境偶尔会复现, 具体: 一般使用不会出现这个问题,因为一般引入的是element-ui的css文件,问题出在于为了主题色变化啊,需要用到scss变量引入了scss文件。 import “~element-ui/packages/theme-chalk/src/index”…

Python练习题(四)

本文主要是【Python】——Python练习题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句:狠狠沉淀&a…

图像语义分割算法(FCN/U-net)

Some definitions  与目标检测不同,语义分割任务不但要对图片中的物体的位置和类别进行预测,还要精确地描绘出不同类物体之间的边界(注意是不同类物体,而不是不同物体。若对同一类的不同物体也进行区分,则…

iptables防火墙之SNAT与DNET

NAT 1.SNAT:让内网可以访问外网 2.DNAT:让外网可以访问到内网的机器 网关服务器,要开启路由功能 内核功能: sysctl -a 列出所有参数 内核参数,然后grep可以查看到默认的内核参数 内核参数配置文件 /etc/sysctl.…

【ArcGIS Pro微课1000例】0046:深度学习--汽车检测

本实验讲述ArcGIS Pro中人工智能深度学习应用之–汽车检测。 文章目录 一、学习效果二、工具介绍三、案例实现四、注意事项一、学习效果 采用深度学习工具,可以很快速精准的识别汽车。 案例一: 案例二: 下面讲解GIS软件实现流程。 二、工具介绍 该案例演示的是ArcGIS Pro中…

L1-018:大笨钟

题目描述 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数…