ToB企服应用市场:ToB评测及商务社交产业平台

标题: 数据仓库系列 5:什么是事实表和维度表,它们有什么作用? [打印本页]

作者: 勿忘初心做自己    时间: 2024-9-19 12:24
标题: 数据仓库系列 5:什么是事实表和维度表,它们有什么作用?


  
想象一下,你正在驾驶一架数据飞机,翱翔在众多的数据仓库上空。你的左翼是事实表,记载着业务的每一次跳动;右翼是维度表,为你的数据赋予丰富的上下文。没有这对翅膀,你的数据分析之旅将无法起飞。本日,让我们一起深入探索这个数据仓库的焦点概念,看看它如何彻底改变你的数据分析方式!

1. 引言:事实表与维度表的魔力

在大数据的天下里,事实表(Fact Table)和维度表(Dimension Table)就像是构建数据仓库的两大支柱。它们不但是数据存储的根本单元,更是整个数据分析体系的基石。但是,你大概会问:“为什么我们需要区分事实表和维度表?它们到底有什么魔力?”
让我们打个比方:想象你正在谋划一家在线书店。每天,你都会收到大量的订单信息。这些订单就像是流星雨,携带着大量的原始数据信息。假如我们把这些数据直接堆积在一起,就会形成一个难以理解和分析的数据黑洞。这时,事实表和维度表就派上用场了。
事实表就像是一本详细的日记,记载着每一笔交易的关键信息:谁(客户)在什么时间(时间)买了什么书(产品),花了多少钱(金额)。而维度表则像是一本百科全书,提供了对这些交易更深入的表明:客户的详细信息,书籍的分类和作者,时间的各个层面(年、月、日、季度)等。
通过这种方式,我们不但可以回答"发生了什么"的问题(通过事实表),还能回答"为什么发生"和"如何发生"的问题(通过维度表)。这就是事实表和维度表的魔力所在!
接下来,让我们深入探究这两种表的本质,看看它们如何协同工作,为我们的数据分析提供无与伦比的洞察力。

2. 事实表:业务活动的数字足迹

2.1 什么是事实表?

事实表是数据仓库中最焦点的表,它记载了业务过程中的度量事件。简单来说,事实表就是用来存储业务过程中的"事实"的。这里的"事实"通常是可以计数、求和或平均的数值。
在我们的在线书店例子中,一个典型的事实表大概是"贩卖事实表",它记载了每一次图书贩卖的详细信息。

2.2 事实表的特征

2.3 事实表的范例


2.4 事实表现例

让我们来看一个详细的贩卖事实表例子:
  1. CREATE TABLE sales_fact (
  2.     sale_id INT PRIMARY KEY,
  3.     date_key INT,
  4.     product_key INT,
  5.     customer_key INT,
  6.     store_key INT,
  7.     quantity INT,
  8.     unit_price DECIMAL(10,2),
  9.     total_price DECIMAL(10,2),
  10.     FOREIGN KEY (date_key) REFERENCES date_dim(date_key),
  11.     FOREIGN KEY (product_key) REFERENCES product_dim(product_key),
  12.     FOREIGN KEY (customer_key) REFERENCES customer_dim(customer_key),
  13.     FOREIGN KEY (store_key) REFERENCES store_dim(store_key)
  14. );
复制代码
在这个例子中:

2.5 事实表的作用

2.6 事实表的筹划原则

2.7 事实表的查询示例

让我们通过一个查询示例来看看如何使用事实表进行分析:
  1. SELECT
  2.     d.year,
  3.     p.category,
  4.     SUM(s.total_price) as total_sales,
  5.     COUNT(DISTINCT s.customer_key) as unique_customers
  6. FROM
  7.     sales_fact s
  8.     JOIN date_dim d ON s.date_key = d.date_key
  9.     JOIN product_dim p ON s.product_key = p.product_key
  10. GROUP BY
  11.     d.year, p.category
  12. ORDER BY
  13.     d.year, total_sales DESC;
复制代码
这个查询:
通过这个查询,我们可以得到每年每个产品类别的贩卖表现,以及吸引的客户数目,这对于分析产品类别的表现趋势非常有效。
3. 维度表:为数据赋予意义

3.1 什么是维度表?


维度表是数据仓库中用来描述业务对象特征的表。它们为事实表中的数字度量提供上下文,使得数据更容易理解和分析。维度表通常包含描述性的、文本型的字段,这些字段用于过滤、分组和标记。
在我们的在线书店例子中,典型的维度表大概包罗:客户维度表、产品维度表、时间维度表等。
3.2 维度表的特征

3.3 维度表的范例

3.4 维度表现例

让我们来看一个详细的产品维度表例子:
  1. CREATE TABLE product_dim (
  2.     product_key INT PRIMARY KEY,
  3.     product_id VARCHAR(50),
  4.     product_name VARCHAR(100),
  5.     category VARCHAR(50),
  6.     subcategory VARCHAR(50),
  7.     brand VARCHAR(50),
  8.     price DECIMAL(10,2),
  9.     cost DECIMAL(10,2),
  10.     description TEXT,
  11.     launch_date DATE,
  12.     is_active BOOLEAN
  13. );
复制代码
在这个例子中:

3.5 维度表的作用

3.6 维度表的筹划原则

3.7 维度表的查询示例

让我们通过一个查询示例来看看如何使用维度表进行分析:
  1. SELECT
  2.     c.customer_segment,
  3.     p.category,
  4.     d.year,
  5.     d.quarter,
  6.     SUM(s.total_price) as total_sales,
  7.     COUNT(DISTINCT s.sale_id) as number_of_orders,
  8.     AVG(s.total_price) as average_order_value
  9. FROM
  10.     sales_fact s
  11.     JOIN customer_dim c ON s.customer_key = c.customer_key
  12.     JOIN product_dim p ON s.product_key = p.product_key
  13.     JOIN date_dim d ON s.date_key = d.date_key
  14. WHERE
  15.     d.year = 2023
  16. GROUP BY
  17.     c.customer_segment,
  18.     p.category,
  19.     d.year,
  20.     d.quarter
  21. ORDER BY
  22.     c.customer_segment,
  23.     total_sales DESC;
复制代码
这个查询:
通过这个查询,我们可以得到2023年每个季度不同客户细分在各产品类别上的贩卖表现,这对于相识客户行为和产品表现非常有代价。
4. 事实表和维度表的协## 4. 事实表和维度表的协同作用

事实表和维度表并不是孤立存在的,它们之间的关系和协同作用是数据仓库筹划的精髓所在。让我们深入探究它们如何共同工作,为数据分析提供强盛的支持。
4.1 星型模式(Star Schema)

星型模式是最常见的数据仓库模式之一,它由一个中心事实表和多个维度表组成,形状类似于星星。
  1.        +--------------+
  2.        |   客户维度   |
  3.        +--------------+
  4.               |
  5.               |
  6. +--------------+     +--------------+
  7. |   时间维度   |-----|   销售事实   |-----| 产品维度    |
  8. +--------------+     +--------------+     +--------------+
  9.               |
  10.               |
  11.        +--------------+
  12.        |   店铺维度   |
  13.        +--------------+
复制代码
长处:

缺点:

4.2 雪花模式(Snowflake Schema)

雪花模式是星型模式的变体,其中一些维度表被进一步规范化,形成了多层结构。
  1.                  +--------------+
  2.                  |     国家     |
  3.                  +--------------+
  4.                         |
  5.                  +--------------+
  6.                  |     城市     |
  7.                  +--------------+
  8.                         |
  9.        +--------------+ |
  10.        |   客户维度   |-+
  11.        +--------------+
  12.               |
  13.               |
  14. +--------------+     +--------------+
  15. |   时间维度   |-----|   销售事实   |-----| 产品维度    |
  16. +--------------+     +--------------+     +--------------+
  17.               |                                  |
  18.               |                           +--------------+
  19.        +--------------+                   |   类别维度   |
  20.        |   店铺维度   |                   +--------------+
  21.        +--------------+
复制代码
长处:

缺点:

4.3 事实表和维度表的协同查询示例

让我们通过一个复杂一点的查询示例来展示事实表和维度表如何协同工作:
  1. WITH monthly_sales AS (
  2.     SELECT
  3.         d.year,
  4.         d.month,
  5.         p.category,
  6.         c.customer_segment,
  7.         s.store_key,
  8.         SUM(sf.total_price) as total_sales,
  9.         COUNT(DISTINCT sf.customer_key) as unique_customers
  10.     FROM
  11.         sales_fact sf
  12.         JOIN date_dim d ON sf.date_key = d.date_key
  13.         JOIN product_dim p ON sf.product_key = p.product_key
  14.         JOIN customer_dim c ON sf.customer_key = c.customer_key
  15.         JOIN store_dim s ON sf.store_key = s.store_key
  16.     WHERE
  17.         d.year = 2023
  18.     GROUP BY
  19.         d.year, d.month, p.category, c.customer_segment, s.store_key
  20. ),
  21. store_rankings AS (
  22.     SELECT
  23.         year,
  24.         month,
  25.         category,
  26.         customer_segment,
  27.         store_key,
  28.         total_sales,
  29.         unique_customers,
  30.         ROW_NUMBER() OVER (PARTITION BY year, month, category, customer_segment
  31.                            ORDER BY total_sales DESC) as store_rank
  32.     FROM
  33.         monthly_sales
  34. )
  35. SELECT
  36.     sr.year,
  37.     sr.month,
  38.     sr.category,
  39.     sr.customer_segment,
  40.     s.store_name,
  41.     s.city,
  42.     s.state,
  43.     sr.total_sales,
  44.     sr.unique_customers,
  45.     sr.store_rank
  46. FROM
  47.     store_rankings sr
  48.     JOIN store_dim s ON sr.store_key = s.store_key
  49. WHERE
  50.     sr.store_rank <= 3
  51. ORDER BY
  52.     sr.year, sr.month, sr.category, sr.customer_segment, sr.store_rank;
复制代码
这个查询做了以下事情:
这个查询展示了如何使用事实表和多个维度表进行复杂的分析。我们不但可以看到贩卖表现,还能相识到最佳表现的商店及其位置,这对于相识不同地区、不同客户群的贩卖趋势非常有代价。
5. 事实表和维度表的筹划最佳实践

筹划高效的事实表和维度表是构建乐成数据仓库的关键。以下是一些最佳实践:
5.1 事实表筹划最佳实践

5.2 维度表筹划最佳实践

5.3 事实表和维度表协同筹划最佳实践

6. 现实应用案例:电子商务数据仓库

让我们通过一个电子商务数据仓库的案例来看看如何应用事实表和维度表的概念。
6.1 需求分析

假设我们正在为一个在线书店筹划数据仓库。主要的分析需求包罗:

6.2 模子筹划

基于这些需求,我们可以筹划以下的星型模式:
6.3 表结构

让我们详细看看其中几个表的结构:
  1. -- 销售事实表
  2. CREATE TABLE sales_fact (
  3.     sale_key INT PRIMARY KEY,
  4.     date_key INT,
  5.     product_key INT,
  6.     customer_key INT,
  7.     store_key INT,
  8.     quantity INT,
  9.     unit_price DECIMAL(10,2),
  10.     total_price DECIMAL(10,2),
  11.     discount_amount DECIMAL(10,2),
  12.     FOREIGN KEY (date_key) REFERENCES date_dim(date_key),
  13.     FOREIGN KEY (product_key) REFERENCES product_dim(product_key),
  14.     FOREIGN KEY (customer_key) REFERENCES customer_dim(customer_key),
  15.     FOREIGN KEY (store_key) REFERENCES store_dim(store_key)
  16. );
  17. -- 产品维度表
  18. CREATE TABLE product_dim (
  19.     product_key INT PRIMARY KEY,
  20.     product_id VARCHAR(50),
  21.     product_name VARCHAR(100),
  22.     author VARCHAR(100),
  23.     publisher VARCHAR(100),
  24.     category VARCHAR(50),
  25.     subcategory VARCHAR(50),
  26.     price DECIMAL(10,2),
  27.     cost DECIMAL(10,2),
  28.     publication_date DATE,
  29.     is_active BOOLEAN
  30. );
  31. -- 客户维度表
  32. CREATE TABLE customer_dim (
  33.     customer_key INT PRIMARY KEY,
  34.     customer_id VARCHAR(50),
  35.     first_name VARCHAR(50),
  36.     last_name VARCHAR(50),
  37.     email VARCHAR(100),
  38.     phone VARCHAR(20),
  39.     address VARCHAR(200),
  40.     city VARCHAR(50),
  41.     state VARCHAR(50),
  42.     country VARCHAR(50),
  43.     postal_code VARCHAR(20),
  44.     registration_date DATE,
  45.     customer_segment VARCHAR(50)
  46. );
  47. -- 时间维度表
  48. CREATE TABLE date_dim (
  49.     date_key INT PRIMARY KEY,
  50.     date DATE,
  51.     day_of_week VARCHAR(10),
  52.     day_of_month INT,
  53.     month INT,
  54.     quarter INT,
  55.     year INT,
  56.     is_weekend BOOLEAN,
  57.     is_holiday BOOLEAN
  58. );
复制代码
6.4 示例查询

下面是一些使用这个数据仓库模子的示例查询:
  1. SELECT
  2.     d.year,
  3.     d.month,
  4.     p.category,
  5.     SUM(s.total_price) as total_sales,
  6.     COUNT(DISTINCT s.customer_key) as unique_customers
  7. FROM
  8.     sales_fact s
  9.     JOIN date_dim d ON s.date_key = d.date_key
  10.     JOIN product_dim p ON s.product_key = p.product_key
  11. GROUP BY
  12.     d.year, d.month, p.category
  13. ORDER BY
  14.     d.year, d.month, total_sales DESC;
复制代码
  1. SELECT
  2.     c.customer_segment,
  3.     COUNT(DISTINCT s.customer_key) as customer_count,
  4.     SUM(s.total_price) as total_sales,
  5.     AVG(s.total_price) as avg_order_value
  6. FROM
  7.     sales_fact s
  8.     JOIN customer_dim c ON s.customer_key = c.customer_key
  9.     JOIN date_dim d ON s.date_key = d.date_key
  10. WHERE
  11.     d.year = 2023
  12. GROUP BY
  13.     c.customer_segment
  14. ORDER BY
  15.     total_sales DESC;
复制代码
  1. SELECT
  2.     p.author,
  3.     COUNT(DISTINCT s.sale_key) as number_of_sales,
  4.     SUM(s.quantity) as total_books_sold,
  5.     SUM(s.total_price) as total_revenue
  6. FROM
  7.     sales_fact s
  8.     JOIN product_dim p ON s.product_key = p.product_key
  9.     JOIN date_dim d ON s.date_key = d.date_key
  10. WHERE
  11.     d.year = 2023
  12. GROUP BY
  13.     p.author
  14. ORDER BY
  15.     total_revenue DESC
  16. LIMIT 10;
复制代码
这些查询展示了如何使用事实表和维度表的组合来回答各种业务问题。通过调整维度和度量,我们可以灵活地进行各种分析。
7. 结论

事实表和维度表是数据仓库筹划的焦点概念,它们共同构成了强盛而灵活的数据分析基础。通过本文的深入探究,我们可以得出以下几点重要结论:
总的来说,掌握事实表和维度表的概念及其筹划原则,对于构建高效、灵活的数据仓库至关重要。它不但是数据工程师的必备技能,也是数据分析师、业务分析师以致管理者理解和使用数据的基础。在当今数据驱动的商业环境中,这些知识将帮助你更好地挖掘数据的代价,为企业创造竞争上风。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4