3、血缘元数据模型:元数据采集范围、元数据存储结构(图数据库 vs 关系型数据库)

血缘元数据模型是工程分析平台中数据血缘构建的核心骨架。它定义了“采集什么”、“存在哪里”以及“如何查询”三个关键问题。本章从元数据采集范围出发,对比图数据库与关系型数据库在血缘存储上的优劣,并给出选型建议。

3.1 元数据采集范围

血缘分析依赖的元数据并非单一类型,而是覆盖从数据源到消费端的全链路信息。根据采集对象,可分为以下四大类:

类别 采集对象 典型内容 采集方式
技术元数据 数据源、表、字段、分区 库名、表名、字段类型、主键、外键、分区键、存储路径 JDBC/ODBC 扫描、Hive Metastore API、文件系统遍历
作业元数据 ETL 任务、调度任务、SQL 脚本 任务 ID、调度时间、输入/输出表、SQL 文本、执行计划 日志解析、调度系统 API、SQL 解析器
数据血缘元数据 字段级依赖、表级依赖、转换逻辑 源字段→目标字段映射、函数调用、过滤条件、聚合逻辑 SQL 解析(AST 分析)、运行时拦截、手动标注
业务元数据 数据字典、业务术语、数据质量规则 字段业务含义、枚举值说明、数据质量约束、数据分类分级 人工录入、数据治理平台导入
实践建议: 初期优先采集技术元数据和作业元数据,血缘元数据通过 SQL 解析自动生成;业务元数据可在平台上线后逐步补充,避免因采集范围过大导致项目延期。

3.2 元数据存储结构:图数据库 vs 关系型数据库

血缘数据本质上是“节点-边”结构(节点为表/字段,边为依赖关系),传统关系型数据库(RDBMS)与图数据库(Graph DB)在存储和查询上存在显著差异。下表从多个维度进行对比:

对比维度 关系型数据库(如 MySQL、PostgreSQL) 图数据库(如 Neo4j、JanusGraph)
数据模型 表 + 外键关联,血缘关系需通过 JOIN 表实现 节点 + 边,血缘关系天然为图结构
多跳查询性能 深度超过 3 层时 JOIN 性能急剧下降,需递归 CTE 或多次查询 原生支持深度遍历,n 跳查询性能与跳数近似线性
字段级血缘 需额外设计字段映射表,查询复杂 字段作为节点,字段间边直接表达映射关系
变更管理 表结构变更需 DDL 操作,历史版本维护成本高 节点/边可带时间戳属性,支持多版本快照
查询语言 SQL(标准,生态成熟) Cypher / Gremlin / SPARQL(需学习成本)
事务与一致性 强 ACID,适合精确计费、元数据管理 多数为最终一致性,部分支持 ACID(如 Neo4j)
运维复杂度 低,DBA 技能普遍 较高,需掌握图数据库集群、索引调优
适用场景 元数据管理、数据字典、批量血缘统计 交互式血缘溯源、影响分析、全链路可视化

3.3 混合存储架构

在实际工程中,单一存储往往无法满足所有需求。推荐采用“关系型数据库 + 图数据库”混合架构,各取所长:

  • 关系型数据库:存储元数据基础信息(表结构、字段定义、作业配置、数据质量规则),利用 ACID 特性保证数据一致性,支持复杂统计查询。
  • 图数据库:存储血缘关系(表级依赖、字段级映射),提供毫秒级的多跳查询,支撑前端血缘图谱的交互式探索。

数据同步策略:通过 CDC(变更数据捕获)或定时任务,将关系型数据库中的元数据变更同步至图数据库,保持血缘关系的时效性。

架构要点: 关系型数据库作为“元数据事实库”,图数据库作为“血缘关系查询引擎”。两者通过统一的元数据 ID 关联,避免数据冗余。

3.4 血缘元数据模型结构图

下图展示了混合存储架构下的核心数据模型,包含节点类型、边类型以及存储分配:

血缘元数据模型混合存储架构 血缘元数据模型混合存储架构 关系型数据库(元数据事实库) 表元数据 字段元数据 作业元数据 数据质量规则 图数据库(血缘关系引擎) 表节点 (t1, t2) 字段节点 (c1, c2) 作业节点 (job1) 血缘边 (依赖) CDC 同步 说明 • 关系型数据库存储元数据基础信息,保证数据一致性与统计能力 • 图数据库存储血缘关系,提供深度遍历与交互式溯源 • CDC 同步机制确保两个存储间的元数据 ID 一致,避免数据孤岛

3.5 字段级血缘存储示例

字段级血缘是血缘分析中最精细、也最有价值的粒度。以下分别展示关系型数据库和图数据库的存储方式:

3.5.1 关系型数据库存储(字段映射表)

-- 字段映射表结构
CREATE TABLE field_lineage (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    source_table_id BIGINT NOT NULL,
    source_field_id BIGINT NOT NULL,
    target_table_id BIGINT NOT NULL,
    target_field_id BIGINT NOT NULL,
    transform_expression TEXT COMMENT '转换逻辑,如:CONCAT(a, b)',
    job_id BIGINT COMMENT '产生该血缘的作业ID',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_target (target_table_id, target_field_id),
    INDEX idx_source (source_table_id, source_field_id)
);

-- 查询某个字段的上游血缘(3层)
WITH RECURSIVE upstream AS (
    SELECT source_table_id, source_field_id, 1 AS depth
    FROM field_lineage
    WHERE target_table_id = 101 AND target_field_id = 5
    UNION ALL
    SELECT fl.source_table_id, fl.source_field_id, u.depth + 1
    FROM field_lineage fl
    INNER JOIN upstream u ON fl.target_table_id = u.source_table_id
        AND fl.target_field_id = u.source_field_id
    WHERE u.depth < 10
)
SELECT * FROM upstream;

3.5.2 图数据库存储(Cypher 查询)

// 创建字段节点和血缘边
CREATE (f1:Field {id: 101, name: 'user_id', table: 'ods_user'})
CREATE (f2:Field {id: 102, name: 'user_id', table: 'dwd_order'})
CREATE (f1)-[:MAPS_TO {transform: 'CAST', job: 'etl_job_01'}]->(f2)

// 查询字段 'dwd_order.user_id' 的完整上游血缘
MATCH (target:Field {name: 'user_id', table: 'dwd_order'})
CALL apoc.path.expand(target, 'MAPS_TO>', '+Field', 1, 10)
YIELD path
RETURN path
注意: 关系型数据库的递归 CTE 在深度超过 5 层时性能明显下降,且 SQL 写法复杂;图数据库的 Cypher 查询更直观,且深度遍历性能稳定。如果项目对交互式血缘溯源有强需求,建议优先采用图数据库。

3.6 选型决策矩阵

根据项目阶段和团队能力,可参考以下矩阵进行存储选型:

项目特征 推荐存储 理由
团队无图数据库运维经验,项目周期短 关系型数据库 SQL 生态成熟,DBA 技能普遍,快速上线
需要交互式血缘图谱,深度溯源频繁 图数据库 多跳查询性能优异,可视化集成方便
既有元数据管理需求,又有血缘查询需求 混合架构 各取所长,关系型管事实,图数据库管关系
数据量极大(百亿级节点/边) 分布式图数据库(JanusGraph) 支持水平扩展,可承载超大规模血缘

总结:血缘元数据模型的设计应遵循“采集全面、存储分层、查询高效”的原则。采集范围覆盖技术、作业、血缘、业务四类元数据;存储结构推荐混合架构,以关系型数据库为事实库,图数据库为查询引擎,兼顾数据一致性与查询性能。