4. 口径元数据模型设计
口径元数据模型是整个指标管理平台的“数据字典”,它定义了指标口径的存储结构、关联关系和生命周期。一个设计良好的元数据模型,能够支撑口径的版本追溯、血缘分析、维度对齐和自动化调度。本节从实体关系图、核心字段定义两个维度展开。
4.1 口径元数据实体关系图
口径元数据模型围绕 口径定义 这一核心实体,向外关联维度、粒度、表达式、版本、调度任务等周边实体。下图展示了各实体之间的主外键关系与依赖层级。
设计要点: 口径定义作为中心实体,通过外键关联维度与粒度,实现“一个口径对应一组维度+一个粒度”的标准化约束。版本与调度任务的 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) |
| 变更频率 | 低,维度值相对稳定 | 极低,粒度枚举基本固定 |
常见误区: 将维度与粒度混为一谈。例如,将“天”既作为维度又作为粒度,会导致口径语义歧义。正确做法:维度描述“按什么切分”,粒度描述“按什么聚合”,两者不可替代。
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结构支持自动生成血缘关系,提升数据治理效率。