4. 口径元数据模型设计

口径元数据模型是整个指标管理平台的“数据字典”,它定义了指标口径的存储结构、关联关系和生命周期。一个设计良好的元数据模型,能够支撑口径的版本追溯、血缘分析、维度对齐和自动化调度。本节从实体关系图、核心字段定义两个维度展开。

4.1 口径元数据实体关系图

口径元数据模型围绕 口径定义 这一核心实体,向外关联维度、粒度、表达式、版本、调度任务等周边实体。下图展示了各实体之间的主外键关系与依赖层级。

口径元数据实体关系图 口径元数据实体关系图 口径定义 口径ID / 名称 / 表达式 维度 维度ID / 维度名称 粒度 粒度ID / 粒度名称 表达式 表达式ID / 表达式内容 版本 版本ID / 版本号 / 生效时间 调度任务 任务ID / 调度周期 N:1 N:1 1:N 1:N 1:N 说明:口径定义与维度、粒度为 N:1 关系;与表达式、版本、调度任务为 1:N 关系。
设计要点: 口径定义作为中心实体,通过外键关联维度与粒度,实现“一个口径对应一组维度+一个粒度”的标准化约束。版本与调度任务的 1:N 关系,支撑口径的变更追溯与自动化执行。

4.2 核心字段定义

口径元数据模型的核心字段包括:口径ID、名称、表达式、维度、粒度。下表详细说明每个字段的语义、数据类型与约束规则。

字段名称 数据类型 约束 字段说明
口径ID VARCHAR(64) 主键,非空,唯一 全局唯一标识,建议采用“KPI_”前缀+UUID或雪花ID,例如 KPI_20250315_001
名称 VARCHAR(128) 非空 口径的中文名称,例如“当日新增注册用户数”,需保持业务语义清晰
表达式 TEXT 非空 口径的计算逻辑,支持SQL、Python或自定义DSL;需包含聚合函数与过滤条件
维度 VARCHAR(64) 外键,非空 关联维度表的主键,例如“DIM_DATE”、“DIM_REGION”,决定口径的分析视角
粒度 VARCHAR(64) 外键,非空 关联粒度表的主键,例如“GRAN_DAY”、“GRAN_HOUR”,决定口径的数据聚合层级
字段设计原则:
  • 口径ID 必须全局唯一,避免跨系统合并时冲突。
  • 表达式 建议存储为结构化AST(抽象语法树)JSON,便于解析与版本对比。
  • 维度 与 粒度 作为外键,需在维度表与粒度表中预定义枚举值,防止脏数据。

4.3 维度与粒度元数据

维度与粒度是口径元数据模型的“左右手”,它们共同决定了指标的分析范围与聚合层级。下表对比两者的核心差异。

对比维度 维度 粒度
定义 指标的分析视角,如时间、地域、渠道 指标的数据聚合层级,如天、小时、分钟
示例值 DIM_DATE, DIM_REGION, DIM_CHANNEL GRAN_DAY, GRAN_HOUR, GRAN_MINUTE
存储方式 维度表,包含维度ID、维度名称、层级关系 粒度表,包含粒度ID、粒度名称、时间单位
关联关系 一个口径可关联多个维度(N:1) 一个口径只关联一个粒度(N:1)
变更频率 低,维度值相对稳定 极低,粒度枚举基本固定
维度与粒度关联示例 维度与粒度关联示例 当日新增注册用户数 DIM_DATE DIM_REGION DIM_CHANNEL GRAN_DAY 维度:时间 维度:地域 维度:渠道 粒度:天 示例:口径“当日新增注册用户数”关联3个维度(日期、地域、渠道),粒度为天。
常见误区: 将维度与粒度混为一谈。例如,将“天”既作为维度又作为粒度,会导致口径语义歧义。正确做法:维度描述“按什么切分”,粒度描述“按什么聚合”,两者不可替代。

4.4 表达式元数据设计

表达式是口径的核心计算逻辑,其元数据设计直接影响口径的可维护性与可解析性。建议采用以下字段结构:

字段名称 数据类型 约束 字段说明
表达式ID VARCHAR(64) 主键,非空 表达式唯一标识,与口径ID关联
表达式内容 TEXT 非空 原始表达式文本,例如 COUNT(DISTINCT user_id) WHERE register_date = today()
表达式类型 VARCHAR(32) 非空 枚举值:SQL、Python、DSL
AST结构 JSON 可选 表达式的抽象语法树,用于版本对比与血缘分析
参数列表 JSON 可选 表达式中的动态参数,如 [{"name":"start_date","type":"date"}]
-- 示例:口径表达式存储为SQL
口径ID: KPI_20250315_001
表达式内容: 
SELECT 
  COUNT(DISTINCT user_id) AS new_users
FROM 
  user_register_log
WHERE 
  register_date = CURRENT_DATE
  AND channel IN ('app', 'web')
表达式类型: SQL
AST结构: {
  "type": "SELECT",
  "aggregation": "COUNT(DISTINCT)",
  "field": "user_id",
  "filter": {
    "register_date": "CURRENT_DATE",
    "channel": ["app", "web"]
  }
}
最佳实践: 表达式元数据中存储AST结构,可以快速对比两个版本的口令是否等价,避免重复口径。同时,AST结构支持自动生成血缘关系,提升数据治理效率。