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 数据质量评估
数据质量评估是数据模型迁移中不可忽视的一环。脏数据或不一致的数据会直接导致迁移失败或目标库数据不可用。评估工作应覆盖完整性、一致性、准确性和时效性四个维度。
以下是一个数据质量评估的流程示意图:
在实际操作中,数据质量评估通常通过编写 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%,且无其他明显质量问题,可直接迁移。