AnyLine DDL 全量支持
面向数百种数据库的结构定义语言统一适配方案
为什么DDL全量支持如此困难
数据库有数百种,仅国产库就有数十种。每种数据库的DDL语法都存在差异,即使是同一SQL标准的不同实现也有细节不同。DDL差异不是简单的语法替换,而是语义层面的适配。 开源版8.7.3仅覆盖了主流数据库的基础DDL,商业版本的工作重点在于国产库和特种库的深度适配。
DDL差异全景图——按问题类别
3.1 数据类型映射
| 差异维度 | 典型表现 | 适配策略 |
|---|---|---|
| 类型名称不同 | BOOLEAN在有的库是BOOL,有的库是TINYINT/NUMBER(1),有的库不支持 | 自动类型映射矩阵 |
| 参数语义不同 | VARCHAR(n)的n在有的库是字符数,有的库是字节数;DECIMAL精度上限不同 | 参数语义转换 |
| 特有类型 | 某些库有CLOB/NCLOB、JSONB、MONEY、UUID、INTERVAL等特有类型 | 特有类型降级/升级映射 |
| 时间类型分化 | DATETIME/TIMESTAMP/TIMESTAMPTZ精度不同,时区支持不同 | 时区参数扩展支持 |
| 空间类型差异 | GEOMETRY/GEOMETRY(POINT)/SDO_GEOMETRY等,子类型体系完全不同 | 空间类型子类型映射 |
| 大字段类型 | BLOB/CLOB/TEXT/LONGTEXT/BINARY/VARBINARY/BYTEA映射复杂 | 按功能需求选择映射 |
| 自增列 | IDENTITY/SERIAL/AUTO_INCREMENT/SEQUENCE四种实现方式 | 统一抽象为自增语义 |
| 数值类型 | TINYINT/SMALLINT/INT/BIGINT/NUMBER/NUMERIC/DECIMAL各库支持范围不同 | 精度安全映射 |
3.2 标识符与命名规则
| 差异维度 | 典型表现 | 适配策略 |
|---|---|---|
| 大小写敏感性 | 有的库默认全大写,有的默认小写,有的保留原始大小写 | 统一标识符处理策略 |
| 引号规则 | 双引号保留大小写、反引号、方括号、无引号,各库不同 | 自动选择引号方式 |
| 命名长度限制 | 表名/列名最大长度从30到128不等 | 自动截断或警告 |
| 保留字冲突 | 各库保留字列表不同,同一个词在A库是保留字在B库不是 | 保留字检测与自动加引号 |
| 特殊字符 | 有的库支持中文命名,有的不支持;下划线/数字开头的规则不同 | 命名合法性检查 |
3.3 建表语法差异
| 差异维度 | 典型表现 | 适配策略 |
|---|---|---|
| 存储引擎/表类型 | 有的库支持指定存储引擎、列存储、堆表等 | 条件生成或忽略 |
| 表空间指定 | 部分库要求或支持TABLESPACE子句,部分库不支持 | 按目标库条件生成 |
| 临时表语法 | GLOBAL TEMPORARY/LOCAL TEMPORARY/TEMP/SESSION等不同语法 | 语法自动转换 |
| 存储参数 | STORAGE/FILLFACTOR/PCTFREE等各库特有参数 | 参数映射或忽略 |
| 分区表定义 | 分区语法差异最大 | 独立适配层 |
| 默认值函数 | CURRENT_TIMESTAMP/SYSDATE/NOW()/GETDATE()各不同 | 函数方言转换 |
| ON UPDATE支持 | 部分库支持ON UPDATE CURRENT_TIMESTAMP,部分不支持 | 不支持时降级为触发器 |
| 列计算/生成列 | GENERATED ALWAYS AS / VIRTUAL COLUMN / 计算列,支持程度不同 | 按支持程度生成 |
3.4 索引类型差异
| 差异维度 | 典型表现 | 适配策略 |
|---|---|---|
| 聚集索引 | 部分库主键默认聚集,部分库需显式指定CLUSTER INDEX,部分库无此概念 | 映射策略:按目标库语义生成 |
| 位图索引 | 仅部分库支持,其他库需降级为普通索引 | 特性检测+降级 |
| 函数索引 | 部分库直接支持,部分库需用生成列模拟 | 特性检测+替代方案 |
| 反向索引 | 仅少数库支持 | 降级为普通索引 |
| 全局/局部索引 | 分区表上的索引作用域,部分库支持GLOBAL/LOCAL,部分无区分 | 条件生成 |
| 并发建索引 | CREATE INDEX CONCURRENTLY / ONLINE / 不支持 | 特性检测+条件生成 |
| 部分索引 | WHERE条件的索引,仅部分库支持 | 不支持时忽略 |
| 包含列索引 | INCLUDE子句,仅部分库支持 | 不支持时降级 |
| 唯一约束与索引关系 | 部分库自动建索引,部分库不自动建 | 行为统一 |
3.5 分区表差异——最复杂的适配层
| 差异维度 | 典型表现 | 适配策略 |
|---|---|---|
| 分区类型支持 | 范围/列表/哈希分区各库基本支持;间隔分区仅部分库支持 | 特性检测+降级 |
| 子分区 | 部分库支持多级子分区,部分库不支持 | 不支持时合并为单层分区 |
| 分区数量限制 | 各库对分区数量上限不同 | 合规检查 |
| 分区维护操作 | SPLIT/MERGE/EXCHANGE/ADD/DROP分区语法各不同 | 方言转换 |
| 默认分区 | DEFAULT分区/OTHERS分区的语法和行为不同 | 方言映射 |
| 分区键限制 | 部分库要求分区键必须包含在主键中 | 约束检测与调整 |
| 分区索引 | 全局索引/局部索引的创建和语义差异 | 条件生成 |
| 分区与约束交互 | 唯一约束与分区键的关系,各库规则不同 | 约束兼容性检查 |
3.6 约束实现差异
| 差异维度 | 典型表现 | 适配策略 |
|---|---|---|
| 外键级联操作 | ON DELETE/UPDATE CASCADE/SET NULL/SET DEFAULT/NO ACTION,各库支持组合不同 | 按支持程度降级 |
| 延迟约束 | DEFERRABLE/INITIALLY DEFERRED仅部分库支持 | 不支持时转为即时约束 |
| 约束启用/禁用 | ENABLE/DISABLE CONSTRAINT仅部分库支持 | 不支持时用其他方式实现 |
| 约束验证模式 | VALIDATE/NOVALIDATE仅部分库支持 | 降级处理 |
| CHECK约束 | 表达式语法差异,部分库不支持子查询 | 表达式兼容性检查 |
| 唯一约束与NULL | 多个NULL在唯一约束中的行为各库不同 | 行为统一或警告 |
3.7 其他DDL对象差异
| 对象类型 | 差异概述 | 适配策略 |
|---|---|---|
| 序列 | CREATE SEQUENCE语法基本相似,但缓存、循环、步长等选项有差异 | 选项映射 |
| 视图 | CREATE VIEW基本一致,可更新视图支持程度不同 | 功能检测 |
| 同义词 | 部分库支持SYNONYM,部分库不支持 | 不支持时用VIEW替代 |
| 存储过程/函数 | 语法差异极大,PL/SQL、PL/pgSQL、T-SQL等完全不同体系 | 语言级转换(长期目标) |
| 触发器 | 语法和时机(BEFORE/AFTER/INSTEAD OF)支持不同 | 条件生成 |
| 物化视图 | 部分库支持,部分库不支持 | 降级为普通表+定时刷新 |
| 注释 | COMMENT ON语法不同,部分库用行内注释 | 方言转换 |
| 枚举类型 | 部分库原生支持ENUM,部分库需用CHECK约束模拟 | 类型映射 |
还需要单独实现的功能
4.1 高优先级(信创项目刚需)
| 功能 | 说明 | 预估工作量 |
|---|---|---|
| 分区表DDL完整支持 | 范围/列表/哈希/间隔/子分区,含SPLIT/MERGE/EXCHANGE | 约4-6周 |
| 数据类型扩展参数 | 时间类型时区参数、VARCHAR的byte/char语义、空间类型子类型 | 约3-4周 |
| 标识符统一处理 | 大小写敏感、引号规则、保留字检测、命名合法性检查 | 约2周 |
| 默认值函数转换 | SYSDATE/NOW()/GETDATE()/CURRENT_TIMESTAMP等跨库转换 | 约2周 |
| ON UPDATE降级 | 不支持的库自动生成触发器替代方案 | 约1周 |
| 表空间参数自动生成 | 需要指定TABLESPACE的库自动添加 | 约1周 |
| 元数据查询统一 | 系统表/信息模式差异导致的元数据查询不统一 | 约3周 |
| 兼容模式检测 | 自动检测数据库兼容模式,选择生成策略 | 约2周 |
4.2 中优先级(提升兼容性)
| 功能 | 说明 | 预估工作量 |
|---|---|---|
| 索引类型降级策略 | 位图索引→普通索引、函数索引→生成列模拟、反向索引→普通索引 | 约2周 |
| 约束降级策略 | 延迟约束→即时约束、ENABLE/DISABLE→重建约束 | 约2周 |
| 存储过程/函数DDL | 跨库存储过程语法差异极大,最复杂的长期目标 | 约4周+ |
| 同义词适配 | 支持的库直接创建,不支持的用VIEW替代 | 约1周 |
| 部分索引/包含列索引 | 按目标库支持程度条件生成 | 约1周 |
| 全局/局部索引 | 分区表索引作用域映射 | 约1周 |
4.3 低优先级(完善体验)
| 功能 | 说明 | 预估工作量 |
|---|---|---|
| 并发建索引 | CONCURRENTLY/ONLINE按库条件生成 | 约3天 |
| 存储参数映射 | FILLFACTOR/PCTFREE/STORAGE等各库特有参数 | 约3天 |
| 触发器DDL | 各库语法差异适配 | 约2周 |
| 物化视图 | 支持的库直接创建,不支持的降级为普通表 | 约2周 |
| 枚举类型映射 | ENUM→CHECK约束的自动转换 | 约3天 |
| 可更新视图检测 | 各库可更新视图规则不同 | 约1周 |
实现架构
AnyLine DDL 统一API
↓
DDL抽象元数据 ← 统一中间表示
↓
方言适配层
方言适配层
方言适配层
...数百种
特性检测
模式检测
版本检测
← 自动识别
↓
降级策略引擎
不支持 → 替代方案
部分支持 → 条件生成
完全支持 → 直接生成
1
中间抽象层
DDL先转AnyLine元数据,再按目标库生成方言SQL
2
特性检测
运行时自动检测目标库版本、兼容模式、支持特性
3
降级策略可配置
不支持的特性自动降级为替代方案
4
差异报告
每次DDL生成附带兼容性报告
总结
三层工作占比
| 层次 | 工作内容 | 占比 |
|---|---|---|
| 语法层 | 各库DDL语法差异的转换 | 30% |
| 语义层 | 不支持特性的降级策略 | 40% |
| 元数据层 | 大小写、类型映射、系统表差异 | 30% |