ToB企服应用市场:ToB评测及商务社交产业平台
标题:
数据仓库系列 5:什么是事实表和维度表,它们有什么作用?
[打印本页]
作者:
勿忘初心做自己
时间:
2024-9-19 12:24
标题:
数据仓库系列 5:什么是事实表和维度表,它们有什么作用?
想象一下,你正在驾驶一架数据飞机,翱翔在众多的数据仓库上空。你的左翼是事实表,记载着业务的每一次跳动;右翼是维度表,为你的数据赋予丰富的上下文。没有这对翅膀,你的数据分析之旅将无法起飞。本日,让我们一起深入探索这个数据仓库的焦点概念,看看它如何彻底改变你的数据分析方式!
1. 引言:事实表与维度表的魔力
在大数据的天下里,事实表(Fact Table)和维度表(Dimension Table)就像是构建数据仓库的两大支柱。它们不但是数据存储的根本单元,更是整个数据分析体系的基石。但是,你大概会问:“为什么我们需要区分事实表和维度表?它们到底有什么魔力?”
让我们打个比方:想象你正在谋划一家在线书店。每天,你都会收到大量的订单信息。这些订单就像是流星雨,携带着大量的原始数据信息。假如我们把这些数据直接堆积在一起,就会形成一个难以理解和分析的数据黑洞。这时,事实表和维度表就派上用场了。
事实表就像是一本详细的日记,记载着每一笔交易的关键信息:谁(客户)在什么时间(时间)买了什么书(产品),花了多少钱(金额)。而维度表则像是一本百科全书,提供了对这些交易更深入的表明:客户的详细信息,书籍的分类和作者,时间的各个层面(年、月、日、季度)等。
通过这种方式,我们不但可以回答"发生了什么"的问题(通过事实表),还能回答"为什么发生"和"如何发生"的问题(通过维度表)。这就是事实表和维度表的魔力所在!
接下来,让我们深入探究这两种表的本质,看看它们如何协同工作,为我们的数据分析提供无与伦比的洞察力。
2. 事实表:业务活动的数字足迹
2.1 什么是事实表?
事实表是数据仓库中最焦点的表,它记载了业务过程中的度量事件。简单来说,事实表就是用来存储业务过程中的"事实"的。这里的"事实"通常是可以计数、求和或平均的数值。
在我们的在线书店例子中,一个典型的事实表大概是"贩卖事实表",它记载了每一次图书贩卖的详细信息。
2.2 事实表的特征
粒度(Granularity)
: 事实表的每一行代表一个业务事件,粒度越细,数据越详细。例如,我们的贩卖事实表大概以"每次订单中的每本书"为粒度。
外键(Foreign Keys)
: 事实表通常包含多个外键,这些外键与维度表相关联。
度量值(Measures)
: 这些是可以聚合的数值型数据,如贩卖金额、数目等。
可加性(Additive)
: 大多数事实是可加的,即可以在全部维度上进行聚合。
2.3 事实表的范例
事务事实表(Transaction Fact Table)
: 记载特定事件的度量值,如每次贩卖。
周期快照事实表(Periodic Snapshot Fact Table)
: 定期记载状态,如每月库存。
累积快照事实表(Accumulating Snapshot Fact Table)
: 记载过程的多个阶段,如订单从下单到交付的全过程。
2.4 事实表现例
让我们来看一个详细的贩卖事实表例子:
CREATE TABLE sales_fact (
sale_id INT PRIMARY KEY,
date_key INT,
product_key INT,
customer_key INT,
store_key INT,
quantity INT,
unit_price DECIMAL(10,2),
total_price DECIMAL(10,2),
FOREIGN KEY (date_key) REFERENCES date_dim(date_key),
FOREIGN KEY (product_key) REFERENCES product_dim(product_key),
FOREIGN KEY (customer_key) REFERENCES customer_dim(customer_key),
FOREIGN KEY (store_key) REFERENCES store_dim(store_key)
);
复制代码
在这个例子中:
sale_id 是主键,唯一标识每次贩卖。
date_key, product_key, customer_key, store_key 是外键,关联到相应的维度表。
quantity, unit_price, total_price 是度量值,记载了贩卖的详细数据。
2.5 事实表的作用
记载业务活动
: 事实表捕获了业务过程中的关键事件,为分析提供了基础数据。
支持聚合分析
: 通过事实表,我们可以轻松地进行各种聚合操作,如计算总贩卖额、平均订单金额等。
提供时间序列数据
: 事实表通常包含时间维度,使得我们可以进行时间序列分析,观察业务趋势。
毗连维度
: 事实表通过外键与各个维度表相连,使得我们可以从多个角度分析数据。
2.6 事实表的筹划原则
选择合适的粒度
: 粒度要足够细,以支持各种大概的分析需求,但也要思量到存储和性能的均衡。
确定维度
: 仔细选择与事实相关的维度,确保它们能够提供故意义的分析视角。
选择度量
: 包含那些对业务分析有代价的可聚合度量。
使用署理键
: 为了提高性能和灵活性,通常使用署理键而不是自然键作为主键。
思量历史追踪
: 假如业务需求包罗历史数据分析,思量使用缓慢变革维度(SCD)技能。
2.7 事实表的查询示例
让我们通过一个查询示例来看看如何使用事实表进行分析:
SELECT
d.year,
p.category,
SUM(s.total_price) as total_sales,
COUNT(DISTINCT s.customer_key) as unique_customers
FROM
sales_fact s
JOIN date_dim d ON s.date_key = d.date_key
JOIN product_dim p ON s.product_key = p.product_key
GROUP BY
d.year, p.category
ORDER BY
d.year, total_sales DESC;
复制代码
这个查询:
毗连了贩卖事实表与日期和产品维度表
按年份和产品类别分组
计算了每个组的总贩卖额和唯一客户数
结果按年份和总贩卖额排序
通过这个查询,我们可以得到每年每个产品类别的贩卖表现,以及吸引的客户数目,这对于分析产品类别的表现趋势非常有效。
3. 维度表:为数据赋予意义
3.1 什么是维度表?
维度表是数据仓库中用来描述业务对象特征的表。它们为事实表中的数字度量提供上下文,使得数据更容易理解和分析。维度表通常包含描述性的、文本型的字段,这些字段用于过滤、分组和标记。
在我们的在线书店例子中,典型的维度表大概包罗:客户维度表、产品维度表、时间维度表等。
3.2 维度表的特征
描述性属性
: 维度表包含大量的描述性文本字段,这些字段用于提供业务环境。
层次结构
: 维度表often包含层次结构,如地理维度中的国家-省份-都会。
相对较少的行
: 与事实表相比,维度表通常有较少的行,但每行大概包含很多列。
主键
: 通常使用署理键作为主键,这个键会被用作事实表中的外键。
3.3 维度表的范例
同等性维度(Conformed Dimension)
: 在多个事实表间共享的维度,如时间维度。
退化维度(Degenerate Dimension)
: 存储在事实表中的维度属性,如订单号。
脚色饰演维度(Role-Playing Dimension)
: 同一个维度表在事实表中饰演多个脚色,如在订单事实表中的订单日期和发货日期。
渐变维度(Slowly Changing Dimension, SCD)
: 随时间变革的维度,通常分为SCD1(覆盖),SCD2(保存历史)和SCD3(保存部分历史)。
3.4 维度表现例
让我们来看一个详细的产品维度表例子:
CREATE TABLE product_dim (
product_key INT PRIMARY KEY,
product_id VARCHAR(50),
product_name VARCHAR(100),
category VARCHAR(50),
subcategory VARCHAR(50),
brand VARCHAR(50),
price DECIMAL(10,2),
cost DECIMAL(10,2),
description TEXT,
launch_date DATE,
is_active BOOLEAN
);
复制代码
在这个例子中:
product_key 是署理键,作为主键。
product_id 是业务系统中的原始ID。
其他字段提供了产品的各种属性,如名称、类别、品牌、代价等。
3.5 维度表的作用
提供分析上下文
: 维度表为事实表中的数字提供了丰富的上下文信息,使数据更故意义。
支持多角度分析
: 通过不同的维度,我们可以从多个角度来分析同一组事实数据。
优化查询性能
: 维度表通常被预先聚合和索引,可以大大提高查询性能。
支持数据同等性
: 同等性维度确保了跨多个事实表的分析结果是同等的。
便于理解和使用
: 维度表的结构通常更接近业务用户的思维方式,使得数据更容易被理解和使用。
3.6 维度表的筹划原则
选择合适的粒度
: 维度的粒度应该与相关事实表的粒度相匹配。
使用署理键
: 署理键可以提高性能,并使得处理历史变革更加容易。
包含丰富的属性
: 尽大概包含多的描述性属性,这些属性大概在将来的分析中派上用场。
规范化vs反规范化
: 在维度建模中,通常倾向于反规范化筹划,以提高查询性能。
思量SCD策略
: 根据业务需求,为每个维度选择合适的SCD策略。
保持同等性
: 确保维度在整个数据仓库中保持同等,特别是在多个事实表之间共享时。
3.7 维度表的查询示例
让我们通过一个查询示例来看看如何使用维度表进行分析:
SELECT
c.customer_segment,
p.category,
d.year,
d.quarter,
SUM(s.total_price) as total_sales,
COUNT(DISTINCT s.sale_id) as number_of_orders,
AVG(s.total_price) as average_order_value
FROM
sales_fact s
JOIN customer_dim c ON s.customer_key = c.customer_key
JOIN product_dim p ON s.product_key = p.product_key
JOIN date_dim d ON s.date_key = d.date_key
WHERE
d.year = 2023
GROUP BY
c.customer_segment,
p.category,
d.year,
d.quarter
ORDER BY
c.customer_segment,
total_sales DESC;
复制代码
这个查询:
毗连了贩卖事实表与客户、产品和日期维度表
筛选出2023年的数据
按客户细分、产品类别、年份和季度分组
计算了每个组的总贩卖额、订单数和平均订单代价
结果按客户细分和总贩卖额排序
通过这个查询,我们可以得到2023年每个季度不同客户细分在各产品类别上的贩卖表现,这对于相识客户行为和产品表现非常有代价。
4. 事实表和维度表的协## 4. 事实表和维度表的协同作用
事实表和维度表并不是孤立存在的,它们之间的关系和协同作用是数据仓库筹划的精髓所在。让我们深入探究它们如何共同工作,为数据分析提供强盛的支持。
4.1 星型模式(Star Schema)
星型模式是最常见的数据仓库模式之一,它由一个中心事实表和多个维度表组成,形状类似于星星。
+--------------+
| 客户维度 |
+--------------+
|
|
+--------------+ +--------------+
| 时间维度 |-----| 销售事实 |-----| 产品维度 |
+--------------+ +--------------+ +--------------+
|
|
+--------------+
| 店铺维度 |
+--------------+
复制代码
长处:
查询性能好,因为只需要一次 JOIN 就可以毗连事实表和任何维度表
易于理解和使用,特别是对业务用户来说
维度表黑白规范化的,减少了 JOIN 操作
缺点:
大概导致数据冗余,特别是在维度表中
4.2 雪花模式(Snowflake Schema)
雪花模式是星型模式的变体,其中一些维度表被进一步规范化,形成了多层结构。
+--------------+
| 国家 |
+--------------+
|
+--------------+
| 城市 |
+--------------+
|
+--------------+ |
| 客户维度 |-+
+--------------+
|
|
+--------------+ +--------------+
| 时间维度 |-----| 销售事实 |-----| 产品维度 |
+--------------+ +--------------+ +--------------+
| |
| +--------------+
+--------------+ | 类别维度 |
| 店铺维度 | +--------------+
+--------------+
复制代码
长处:
减少了数据冗余
维护某些范例的维度更容易
缺点:
查询性能大概降落,因为需要更多的 JOIN 操作
结构更复杂,大概更难理解和使用
4.3 事实表和维度表的协同查询示例
让我们通过一个复杂一点的查询示例来展示事实表和维度表如何协同工作:
WITH monthly_sales AS (
SELECT
d.year,
d.month,
p.category,
c.customer_segment,
s.store_key,
SUM(sf.total_price) as total_sales,
COUNT(DISTINCT sf.customer_key) as unique_customers
FROM
sales_fact sf
JOIN date_dim d ON sf.date_key = d.date_key
JOIN product_dim p ON sf.product_key = p.product_key
JOIN customer_dim c ON sf.customer_key = c.customer_key
JOIN store_dim s ON sf.store_key = s.store_key
WHERE
d.year = 2023
GROUP BY
d.year, d.month, p.category, c.customer_segment, s.store_key
),
store_rankings AS (
SELECT
year,
month,
category,
customer_segment,
store_key,
total_sales,
unique_customers,
ROW_NUMBER() OVER (PARTITION BY year, month, category, customer_segment
ORDER BY total_sales DESC) as store_rank
FROM
monthly_sales
)
SELECT
sr.year,
sr.month,
sr.category,
sr.customer_segment,
s.store_name,
s.city,
s.state,
sr.total_sales,
sr.unique_customers,
sr.store_rank
FROM
store_rankings sr
JOIN store_dim s ON sr.store_key = s.store_key
WHERE
sr.store_rank <= 3
ORDER BY
sr.year, sr.month, sr.category, sr.customer_segment, sr.store_rank;
复制代码
这个查询做了以下事情:
计算了2023年每个月、每个产品类别、每个客户细分、每个商店的贩卖总额和唯一客户数。
对每个月、产品类别和客户细分的组合,根据贩卖总额对商店进行了排名。
选出了每个组合中贩卖额排名前三的商店。
最后,我们参加了商店维度表,获取了商店的详细信息。
这个查询展示了如何使用事实表和多个维度表进行复杂的分析。我们不但可以看到贩卖表现,还能相识到最佳表现的商店及其位置,这对于相识不同地区、不同客户群的贩卖趋势非常有代价。
5. 事实表和维度表的筹划最佳实践
筹划高效的事实表和维度表是构建乐成数据仓库的关键。以下是一些最佳实践:
5.1 事实表筹划最佳实践
选择适当的粒度
: 粒度应该足够细,以支持各种大概的分析需求,但也要思量到存储和性能的均衡。
使用署理键
: 使用整数范例的署理键作为主键,而不是使用业务键。这可以提高性能并简化维度变革的处理。
最小化 NULL 值
: 只管避免在事实表中使用 NULL 值,因为它们大概会导致聚合函数出现意外结果。
包含日期键
: 几乎全部的事实表都应该包含一个日期键,以支持时间维度的分析。
思量参加退化维度
: 某些维度属性(如订单号)可以直接存储在事实表中,而不需要单独的维度表。
精确处理不同范例的事实
:
可加事实: 可以在全部维度上进行聚合(如贩卖额)
半可加事实: 只能在某些维度上聚合(如库存水平)
非可加事实: 不能直接聚合,通常是比率(如单价)
优化大表
: 对于非常大的事实表,思量使用分区和索引来提高查询性能。
5.2 维度表筹划最佳实践
使用署理键
: 同样,使用整数范例的署理键作为主键。
包含丰富的属性
: 在维度表中包含尽大概多的描述性属性。这些属性大概在将来的分析中派上用场。
规范化 vs 反规范化
: 在维度建模中,通常倾向于反规范化筹划,以提高查询性能。但要权衡数据冗余和维护的复杂性。
处理层次结构
: 对于具有层次结构的维度(如地理维度),可以将全部层次都包含在同一个维度表中,或者使用雪花模式。
实现缓慢变革维度(SCD)
: 根据业务需求,为每个维度选择合适的 SCD 策略:
SCD1: 直接覆盖旧值
SCD2: 保留历史记载,添加新行
SCD3: 保留部分历史,添加新列
使用同等的命名约定
: 在全部维度表中使用同等的命名约定,这有助于提高可读性和可维护性。
思量脚色饰演维度
: 同一个维度表大概在不同的上下文中饰演不同的脚色(如日期维度可以是订单日期、发货日期等)。
5.3 事实表和维度表协同筹划最佳实践
保持同等性
: 确保维度在整个数据仓库中保持同等,特别是在多个事实表之间共享时。
均衡星型和雪花型模式
: 根据详细需求选择合适的模式。星型模式通常更简单,性能更好;雪花模式可以减少数据冗余。
思量查询模式
: 在筹划时思量最常见的查询模式,确保这些查询能够高效执行。
定期重新评估
: 随着业务的变革,定期重新评估你的筹划,确保它仍然满足需求。
文档化
: 详细记载你的筹划决议、表结构、字段含义等。这对于维护和新团队成员的参加都非常重要。
6. 现实应用案例:电子商务数据仓库
让我们通过一个电子商务数据仓库的案例来看看如何应用事实表和维度表的概念。
6.1 需求分析
假设我们正在为一个在线书店筹划数据仓库。主要的分析需求包罗:
贩卖趋势分析(按时间、产品类别、客户群等)
客户行为分析
库存管理
营销活动结果分析
6.2 模子筹划
基于这些需求,我们可以筹划以下的星型模式:
事实表:
贩卖事实表
库存事实表
营销活动事实表
维度表:
时间维度
产品维度
客户维度
店铺维度
营销活动维度
6.3 表结构
让我们详细看看其中几个表的结构:
-- 销售事实表
CREATE TABLE sales_fact (
sale_key INT PRIMARY KEY,
date_key INT,
product_key INT,
customer_key INT,
store_key INT,
quantity INT,
unit_price DECIMAL(10,2),
total_price DECIMAL(10,2),
discount_amount DECIMAL(10,2),
FOREIGN KEY (date_key) REFERENCES date_dim(date_key),
FOREIGN KEY (product_key) REFERENCES product_dim(product_key),
FOREIGN KEY (customer_key) REFERENCES customer_dim(customer_key),
FOREIGN KEY (store_key) REFERENCES store_dim(store_key)
);
-- 产品维度表
CREATE TABLE product_dim (
product_key INT PRIMARY KEY,
product_id VARCHAR(50),
product_name VARCHAR(100),
author VARCHAR(100),
publisher VARCHAR(100),
category VARCHAR(50),
subcategory VARCHAR(50),
price DECIMAL(10,2),
cost DECIMAL(10,2),
publication_date DATE,
is_active BOOLEAN
);
-- 客户维度表
CREATE TABLE customer_dim (
customer_key INT PRIMARY KEY,
customer_id VARCHAR(50),
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
phone VARCHAR(20),
address VARCHAR(200),
city VARCHAR(50),
state VARCHAR(50),
country VARCHAR(50),
postal_code VARCHAR(20),
registration_date DATE,
customer_segment VARCHAR(50)
);
-- 时间维度表
CREATE TABLE date_dim (
date_key INT PRIMARY KEY,
date DATE,
day_of_week VARCHAR(10),
day_of_month INT,
month INT,
quarter INT,
year INT,
is_weekend BOOLEAN,
is_holiday BOOLEAN
);
复制代码
6.4 示例查询
下面是一些使用这个数据仓库模子的示例查询:
按月、产品类别的贩卖趋势:
SELECT
d.year,
d.month,
p.category,
SUM(s.total_price) as total_sales,
COUNT(DISTINCT s.customer_key) as unique_customers
FROM
sales_fact s
JOIN date_dim d ON s.date_key = d.date_key
JOIN product_dim p ON s.product_key = p.product_key
GROUP BY
d.year, d.month, p.category
ORDER BY
d.year, d.month, total_sales DESC;
复制代码
客户细分分析:
SELECT
c.customer_segment,
COUNT(DISTINCT s.customer_key) as customer_count,
SUM(s.total_price) as total_sales,
AVG(s.total_price) as avg_order_value
FROM
sales_fact s
JOIN customer_dim c ON s.customer_key = c.customer_key
JOIN date_dim d ON s.date_key = d.date_key
WHERE
d.year = 2023
GROUP BY
c.customer_segment
ORDER BY
total_sales DESC;
复制代码
热门作者分析:
SELECT
p.author,
COUNT(DISTINCT s.sale_key) as number_of_sales,
SUM(s.quantity) as total_books_sold,
SUM(s.total_price) as total_revenue
FROM
sales_fact s
JOIN product_dim p ON s.product_key = p.product_key
JOIN date_dim d ON s.date_key = d.date_key
WHERE
d.year = 2023
GROUP BY
p.author
ORDER BY
total_revenue DESC
LIMIT 10;
复制代码
这些查询展示了如何使用事实表和维度表的组合来回答各种业务问题。通过调整维度和度量,我们可以灵活地进行各种分析。
7. 结论
事实表和维度表是数据仓库筹划的焦点概念,它们共同构成了强盛而灵活的数据分析基础。通过本文的深入探究,我们可以得出以下几点重要结论:
互补作用
: 事实表和维度表并不是孤立存在的,而是相互补充、密切协作的。事实表记载了业务过程中的可量化事实,而维度表则为这些事实提供了丰富的上下文信息。这种结构使得我们能够进行多维度、多角度的数据分析。
灵活性与性能的均衡
: 在筹划事实表和维度表时,我们需要在分析的灵活性和查询性能之间探求均衡。星型模式通常提供了很好的查询性能,而雪花模式则可以减少数据冗余。选择哪种模式应该基于详细的业务需求和技能环境。
粒度的重要性
: 选择合适的粒度是筹划事实表的关键。粒度太粗大概会限定分析的深度,而粒度太细则大概导致数据量过大,影响性能。理想的粒度应该能够支持大多数分析需求,同时保持可接受的性能水平。
维度建模的艺术
: 筹划好的维度表需要深入理解业务领域。包含丰富的属性、精确处理层次结构、实现适当的缓慢变革维度策略,这些都是维度建模的艺术所在。
连续优化的过程
: 数据仓库的筹划不是一挥而就的。随着业务的发展和需求的变革,我们需要不断评估和优化我们的事实表和维度表筹划。这大概包罗添加新的维度、调整粒度、优化查询性能等。
支持决议订定
: 最终,事实表和维度表的筹划目的是支持更好的决议订定。通过提供全面、精确、易于分析的数据,数据仓库能够为企业提供宝贵的洞察,帮助管理者做出更明智的决议。
技能与业务的桥梁
: 事实表和维度表的概念不但是技能概念,更是毗连技能和业务的桥梁。它们以一种业务用户能够理解的方式构造数据,使得技能团队和业务团队能够更好地协作。
将来的发展
: 随着大数据技能的发展,事实表和维度表的概念也在不断演化。例如,在一些当代数据仓库解决方案中,我们看到了列式存储、实时数据处理等新技能的应用。但无论技能如何变革,理解业务、公道构造数据的焦点理念始终不变。
总的来说,掌握事实表和维度表的概念及其筹划原则,对于构建高效、灵活的数据仓库至关重要。它不但是数据工程师的必备技能,也是数据分析师、业务分析师以致管理者理解和使用数据的基础。在当今数据驱动的商业环境中,这些知识将帮助你更好地挖掘数据的代价,为企业创造竞争上风。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4