跳转至

投影数据周期说明

一、核心概念

在开始之前,请先了解以下关键概念:

名词 说明
数据周期 表示数据的时间粒度:
无:无明确时间周期(实时数据或静态数据)

日:按天更新的数据

* 月:按月更新的数据

粒度关系: 日 < 月 < 无(日粒度最细)
强依赖 基于该投影和上游投影的数据周期判断是否进行更新。
当上游所有任务都完成目标周期(或更细粒度)的数据更新后,该任务才会执行
弱依赖 不校验数据周期的一致性

二、整体设计思路

设计目标: 让下游的更新频率匹配上游最频繁的数据变化,同时避免无意义的刷新操作。

注意事项:仅在强依赖的条件下,校验数据周期的一致性和覆盖性。

阶段 核心逻辑 目的
定义阶段 下游投影的数据周期:自动继承上游最细粒度的数据周期。
例如:上游为“日 + 月”,则下游投影的数据周期为“日”。
确定投影的数据周期
运行时 检查上游是否有当前周期或更细粒度的更新记录。
周期包含规则:按自然时间判断,大周期包含小周期。 例如:2025年11月(月周期)包含 2025-11-01~2025-11-30(日周期)
匹配逻辑:
投影周期为"月" → 上游则有该月或该月内任一天的更新均满足

投影周期为"日" → 上游需有该日的更新才满足
决定是否刷新物化表

三、定义阶段逻辑

自动推断规则

核心原则:取最细粒度(忽略"无")

上游基础视图数据周期 下游逻辑视图推断结果 推断逻辑
无、月、日 有日就取日
无、日 有日就取日
无、月 无日取月
日、月 有日就取日
仅无 全为无则为无

简化规则:

如果上游包含“日” → 下游为“日”,否则如果上游包含“月” → 下游为“月”,  否则 → 下游为“无”

业务场景示例

场景1:订单分析看板

基础视图A:订单表(数据周期:日)
基础视图B:用户表(数据周期:无)
基础视图C:月度预算表(数据周期:月)

逻辑视图:订单分析汇总
→ 推断数据周期:日(因为订单表是按日更新)

场景2:月度财务报表

基础视图A:配置表(数据周期:无)
基础视图B:月度账单表(数据周期:月)

逻辑视图:财务汇总报表
→ 推断数据周期:月(无日数据,有月数据)

场景3:实时监控看板

基础视图A:系统配置(数据周期:无)
基础视图B:实时监控数据(数据周期:无)

逻辑视图:监控看板
→ 推断数据周期:无(全部为无周期)

四、运行时判断逻辑

投影刷新规则

判断条件: 投影刷新前,检查上游是否有同周期或更细粒度的更新

投影数据周期 = 日
→ 需要检查:上游是否有"日"粒度的更新记录
→ 如果有 → 触发刷新
→ 如果没有 → 跳过刷新

投影数据周期 = 月  
→ 需要检查:上游是否有"月"或"日"粒度的更新记录
→ 如果有 → 触发刷新
→ 如果没有 → 跳过刷新

投影数据周期 = 无
→ 任何上游更新都可能触发刷新

业务场景示例

场景1:日报表刷新

投影:每日销售汇总(数据周期:日)

上游依赖:
- 基础视图A:订单表(数据周期:日)
- 基础视图B:用户表(数据周期:无)

运行时刻:2025-11-18 凌晨2点

判断逻辑:
1. 检查上游基础视图是否有 2025-11-17 的更新记录
2. 订单表:有 2025-11-17 的新数据 ✅
3. 用户表:无周期,不影响判断
4. 结论:触发刷新

场景2:月报表刷新

投影:月度财务报表(数据周期:月)

上游依赖:
- 基础视图A:配置表(数据周期:无)
- 基础视图B:月度账单表(数据周期:月)

运行时刻:2025-12-01 凌晨

判断逻辑:
1. 需要生成 2025-11 月的月报
2. 检查上游是否有 2025-11 月的更新记录
3. 月度账单表:有 2025-11 月的完整数据 ✅
4. 结论:触发刷新

场景3:混合周期场景

逻辑视图:综合分析报表(数据周期:日,因上游有日数据)

上游依赖:
- 基础视图A:日订单(周期:日)
- 基础视图B:月预算(周期:月)

运行时刻:2025-11-18

判断逻辑:
1. 逻辑视图周期为"日",需检查是否有日更新
2. 日订单表:有 2025-11-17 的更新 ✅
3. 月预算表:周期为月,需要判断是否包含2025-11-17的数据,包含✅
4. 结论:触发刷新(因为有日粒度更新)

特殊情况:
- 如果月预算表没有2025-11-17的数据,日订单表无新数据,则跳过刷新(因为没有日粒度更新)

五、常见问题

Q1: 为什么取最细粒度?

A: 保证数据新鲜度

  • 如果上游有日数据,下游也应该能每日更新

  • 避免数据滞后(上游日更新,下游月更新)

举例:

上游:订单表(日更新)+ 配置表(无周期)
下游:如果取"无" → 下游不知道何时更新
下游:如果取"日" → 下游每天能看到最新订单 ✅

Q2: 为什么检查同周期或更细粒度?

A: 避免无效刷新

举例:

逻辑视图:日报表(数据周期:日)
上游更新:仅月预算表更新(月粒度)
结果:无需刷新日报表(因为日粒度数据未变)

原理:

  • 日报表依赖"日"粒度数据

  • 月预算表是"月"粒度,对日报表来说太粗了

  • 月预算更新不影响今天的日报数据

  • 跳过刷新,节省计算资源

Q3: "无"周期有什么特殊性?

A: "无"的含义有两种:

  1. 静态配置表(很少更新)

    • 例如:产品分类表、地区代码表
  2. 实时数据(随时更新)

    • 例如:监控数据、实时流数据