2. 现有数据模型分析:源数据库表结构梳理、字段类型与约束分析、数据质量评估

数据模型迁移的第一步,是对源数据库中的存量数据模型进行全面、细致的分析。这一阶段的核心目标是摸清家底,识别潜在风险,为后续的迁移策略制定与接口开发提供精确的输入。本章节将从表结构梳理、字段类型与约束分析、数据质量评估三个维度展开。

2.1 源数据库表结构梳理

表结构梳理是数据模型分析的起点。我们需要从元数据层面获取所有相关表的完整定义,包括表名、字段名、数据类型、长度、精度、是否为空、默认值、主键、外键、索引以及注释等信息。

梳理工具推荐: 使用数据库自带的系统视图(如 Oracle 的 ALL_TAB_COLUMNS、MySQL 的 INFORMATION_SCHEMA.COLUMNS)或专业的建模工具(如 PowerDesigner、ERwin)可以高效完成此步骤。

以下是一个典型的表结构梳理清单示例:

表名 字段名 数据类型 长度/精度 是否可空 默认值 主键 外键 注释
ENG_MEASUREMENT MEAS_ID NUMBER 12,0 NOT NULL - PK - 测量记录唯一标识
ENG_MEASUREMENT POINT_ID VARCHAR2 32 NOT NULL - - FK → ENG_POINT 测点编号
ENG_MEASUREMENT VALUE FLOAT 126 NULL 0.0 - - 测量数值
ENG_MEASUREMENT MEAS_TIME TIMESTAMP 6 NOT NULL SYSTIMESTAMP - - 测量时间戳
ENG_POINT POINT_ID VARCHAR2 32 NOT NULL - PK - 测点编号
ENG_POINT POINT_NAME VARCHAR2 128 NOT NULL - - - 测点名称

梳理过程中,需要特别关注以下异常情况:

  • 孤儿表: 没有主键或外键关联的表,可能为废弃表或临时表。
  • 冗余表: 结构高度相似的表,可能存在数据冗余或历史遗留问题。
  • 大字段表: 包含 BLOB、CLOB、TEXT 等大字段的表,会影响迁移性能。

2.2 字段类型与约束分析

字段类型与约束分析是评估迁移兼容性的关键环节。不同数据库系统(如 Oracle、MySQL、PostgreSQL)在数据类型和约束实现上存在差异,直接迁移可能导致数据截断、精度丢失或约束失效。

常见陷阱: Oracle 的 NUMBER 类型在迁移到 MySQL 时,需要根据精度和小数位数映射为 DECIMAL、BIGINT 或 INT。若映射不当,可能导致数值溢出或精度损失。

以下是一个字段类型映射分析的示例表格:

源数据库类型 (Oracle) 目标数据库类型 (PostgreSQL) 迁移风险 处理建议
NUMBER(10,0) INTEGER 低 直接映射
NUMBER(18,4) DECIMAL(18,4) 低 直接映射
VARCHAR2(4000) VARCHAR(4000) 中 检查字符集差异,避免字节长度超限
CLOB TEXT 中 评估数据量,考虑分片迁移
DATE TIMESTAMP 低 直接映射,注意时区处理
BLOB BYTEA 高 评估大小,使用流式处理

约束分析方面,需要重点检查:

  • 主键约束: 源库是否使用自增序列或 UUID?目标库是否支持?
  • 外键约束: 迁移顺序是否满足外键依赖?是否需要临时禁用外键?
  • 唯一约束: 源库的唯一索引是否包含 NULL 值?目标库对 NULL 的处理是否一致?
  • 检查约束: 源库的自定义检查条件是否能在目标库中直接使用?

2.3 数据质量评估

数据质量评估是数据模型迁移中不可忽视的一环。脏数据或不一致的数据会直接导致迁移失败或目标库数据不可用。评估工作应覆盖完整性、一致性、准确性和时效性四个维度。

以下是一个数据质量评估的流程示意图:

数据质量评估流程 数据质量评估流程 1. 数据抽样 2. 完整性检查 3. 一致性检查 4. 准确性检查 5. 时效性检查 6. 生成质量报告 说明:各检查步骤可并行执行 最终汇总至质量报告

在实际操作中,数据质量评估通常通过编写 SQL 脚本或使用 ETL 工具完成。以下是一个用于检查字段空值率的 SQL 示例:

-- 检查 ENG_MEASUREMENT 表中 VALUE 字段的空值率
SELECT
    COUNT(*) AS total_rows,
    COUNT(VALUE) AS non_null_rows,
    COUNT(*) - COUNT(VALUE) AS null_rows,
    ROUND((COUNT(*) - COUNT(VALUE)) / COUNT(*) * 100, 2) AS null_percentage
FROM ENG_MEASUREMENT;

-- 检查 ENG_POINT 表中 POINT_NAME 字段的唯一性
SELECT
    POINT_NAME,
    COUNT(*) AS duplicate_count
FROM ENG_POINT
GROUP BY POINT_NAME
HAVING COUNT(*) > 1;
评估结果分级: 根据数据质量问题的影响程度,可将评估结果分为三级:
  • 严重(Red): 数据缺失率 > 20% 或存在关键字段不一致,需人工介入清洗。
  • 警告(Yellow): 数据缺失率在 5% ~ 20% 之间,或存在非关键字段格式问题,可在迁移过程中自动修复。
  • 正常(Green): 数据缺失率 < 5%,且无其他明显质量问题,可直接迁移。