跳至正文

视图物化:“逻辑表”的“退化”及其优劣

2025/05/31 by XILEJUN & Deepseek
2025-07-25 修改,补充《数据分析通识》中的内容

前几日在于阿里瓴羊的产品经理沟通后,发现大家对维度和度量的理解依然受到数据中台的深刻影响。在我看来,其实是维度度量的语境不够清晰。 尝试用 AI 整理一下,后期有机会完整整理发布。

一、基础概念与父子关系类比

1.1 字段的原始状态

在原始数据表中,所有字段都处于”未定义”状态。例如订单表:

  • order_id(订单编号)
  • customer(客户)
  • sales(销售额)
  • region(区域)
  • product(产品)

此时sales只是数字列,region只是文本列,没有维度/度量的区分。

1.2 分析问题赋予身份

当提出具体问题如”各区域销售额是多少?”时,通过SQL查询:

SELECT region AS 区域, SUM(sales) AS 销售额 
FROM orders 
GROUP BY region;

此时发生身份转换:

  • region 成为维度(分组依据)
  • SUM(sales) 成为度量(聚合结果)

类比理解:
就像”父亲”身份需要”孩子”存在才能确立,维度/度量需要分析问题才能获得身份。

二、多层聚合中的角色转换

2.1 嵌套聚合案例

计算”各区域销售额占比”需要两次聚合:

SELECT region, region_sales, region_sales/total_sales*100 AS percent
FROM (
SELECT region,
SUM(sales) AS region_sales,
SUM(SUM(sales)) OVER() AS total_sales
FROM orders
GROUP BY region
) AS temp;

2.2 身份转换三阶段

  1. 原始数据阶段:
  • sales:可聚合数值
  • region:可分组文本
  1. 第一次聚合:
  • SUM(sales):成为度量
  • region:成为维度
  1. 第二次聚合:
  • region_sales:退化为普通数值
  • total_sales:成为新度量

类比说明:
就像父亲在家庭中面对自己的孩子时是父亲,但面对自己的父亲时又变回儿子。

三、物化中间表的实践与局限

-- 创建物化表
CREATE TABLE region_summary AS
SELECT region, SUM(sales) AS region_sales
FROM orders GROUP BY region;
-- 基于物化表计算
SELECT region, region_sales,
region_sales/(SELECT SUM(region_sales) FROM region_summary) AS percent
FROM region_summary;

9.5.1 为什么指标必须在模型之上

假设一个这样的业务场景,一家零售超市在全市四大区域分别有多家门店,每天为数万客户提供各类母婴用品。为了提高公司领导访问经营报告的效率,IT 部门决定把领导当问的几个问题转化为数据仓库的“视图”(view),并每天凌晨6点钟完成一次全量提取作业。对应“视图”如下:

SELECT   YEAR(订单日期) , MONTH(订单日期),

    区域,

    品类,

    SUM(数量) as 数量,

    SUM(数量 * 成交单价)  as 销售额,

    1- SUM(数量 * 商品成本) / SUM(数量 * 成交单价) as 毛利率

FROM superstore

GROUP BY 1,2,3,4

定时提取的“视图”犹如物化视图一般,可以视为数据源阶段预先完成计算、静态存储的物理表,它的后续查询性能极高,这也是被IT 广泛使用的重要原因。数据表样例如表9- 所示:

表9-  高度聚合的统计报表示例:“各年月的区域品类销售表”

年月区域品类数量销售额毛利率
20259东区奶粉4008001020%
20259东区尿裤2002001015%
20259东区日用品300301035%
20259东区服装5005001040%
……………………………………

需要特别注意的是,“物化表”中“数量”“销售额”和“毛利率”仅仅是和年、月一样的数值了,物化的是每一行优秀的聚合值,失去了“聚合”的过程。

笔者把“逻辑视图”的“物化”称之为实质意义上的“退化”!它从逻辑表退化为了物理表,其中的逻辑的、聚合的“度量”退化为表示特定业务意义的“计量属性”,退化为物理意义上的数值。就像失去了投资价值的房地产仅仅是一堆石块,失去了梦想的年轻人如同是一株芦苇。正因为此,本书第8章8.4小节认为,物化的“分析聚合表”也是特殊的事实表。

退化的后果是结果遮挡了细节、失去了灵活性;就像晒成鱼干的鱼儿失去了生的气息。

1)“退化”遮挡了业务的细节

以上面的“各年月的区域品类销售表”为例,当数据提取发生之后,数据表的粒度就止步于“年月、区域、品类”,不能回答任何更细节的问题,比如为什么奶粉9月份销售贡献大幅下滑?为什么日用品的毛利率大幅波动?为什么东区的毛利率贡献持续抵御南区?

2)“退化”让度量失去了灵活性

更严重的问题是,“退化”导致哪些没有可加性(addictive)的“逻辑指标”失去了灵活性。比如,领导希望基于“各年月的区域品类销售表”计算“各年月各地区的总体毛利率”,原本逻辑的毛利率字段(聚合判断)此时失去了适应任何问题的兼容特征,不管是算术平均还是相加都不能获得正确答案;而只能回退到“毛利率”的计算逻辑,倒推计算出“毛利额”而后加权计算。

既然如此,为什么不让逻辑的“毛利率”字段独立于物化表之外呢?

这就是指标落在模型之上,而非模型之中的价值和必要性。

举例……

真正的逻辑指标,对所有问题都有适应能力,就像人适应任何一个环境都能生存;

……

3.2 物化的四大局限

  1. 语义断裂:
  • 原始SUM(sales)逻辑被遗忘
  • region_sales变成无意义的数字
  1. 灵活性丧失:
  • 原本适用所有问题的聚合指标,仅仅在当前行有意义。
  1. 探索受限:
  • 无法追溯销售明细来源——失去了细节,遮挡了业务逻辑
  1. 历史冻结:
  • 数据修正需要全表重建

关键结论

  1. 维度/度量是动态的语境标签
  2. 物化存储是性能与灵活性的权衡
  3. 优秀架构应保持:计算弹性与查询效率的平衡