一、华为 MetaERP 里的「元数据驱动」到底是什么
元数据驱动(Metadata-Driven)不是“把字段配置放数据库里”这么简单,而是把系统结构本身 当数据存。
在 MetaERP 中,元数据层描述:
- 业务对象(采购订单、发票、凭证、物料)
- 字段(名称、类型、是否必填、默认值、可见性)
- 对象关系(一对一、一对多、级联)
- 校验规则、权限策略、审批流
- 界面(列表/表单/仪表盘怎么画)
- 映射到物理表的规则(由迁移引擎生成真实表,不是 EAV 万能值表)
运行时发生什么
你在元数据引擎里定义“采购订单加一个 Project Reference 字段”→ 引擎自动:
- 在物理库生成/变更表列(或通过动态 ORM 映射)
- 生成 CRUD API
- 渲染前端表单+校验
- 挂接权限与审计
不改 Java/Go 代码、不重启、不碰核心表结构。
关键点:元数据是“真理源”,物理表是元数据的投影,不是反过来。
二、MetaERP 里的「微服务」是什么
MetaERP 把传统 ERP 拆成领域服务:
- 采购服务(自己库:PO_HEADER / PO_LINE 等价物)
- 发票服务、付款服务、库存服务
- 会计科目服务、规则引擎服务、主数据服务
特征:
- 每个服务独立部署、独立 Schema/分库、K8s 容器化
- 服务间不直连对方表,只通过 RPC/REST + 消息事件协作
- 跨服务一致性用Saga 补偿事务,不是单库 COMMIT
- 业务动作发事件(“发票已匹配 PO”)→ 财务服务监听 → 实时记凭证
对比单体:EBS 里 PO 保存→触发器→AP 校验→GL 过账,全在同一个 Oracle 库一个事务里;MetaERP 里这是三个服务的本地事务 + 事件串联。
三、元数据 vs Oracle EBS / Fusion 的「数据库表和字段」
1. 表是谁定义的
维度 | Oracle EBS / Fusion | MetaERP(元数据驱动) |
|---|---|---|
表结构来源 | 人写 DDL,PO_HEADERS_ALL、AP_INVOICES_ALL 是固化物理表 | 元数据引擎代码生成/动态映射出物理表 |
加字段 | 建表/加列 DDL + 改 Form + 改并发程序 + 可能改 PLSQL | 在元数据里加一条 Field 记录,引擎同步物理列 |
表与业务对象关系 | 业务对象≈物理表(1:1 很重) | 业务对象=元数据定义,物理表是其运行时投影 |
弹性域角色 | EBS 用 Key Flexfield 把多维度拼成 CCID 大宽表 | 维度是独立元数据实体,可插拔,不拼字符串 |
多租户扩展 | _ALL 表 + ORG_ID 过滤,定制易污染标准表 | 租户元数据层叠加,标准内核不动 |
2. 字段语义差别
- EBS 字段:
SEGMENT1…SEGMENT30在 CCID 里代表公司/科目/部门,含义靠弹性域配置解释,物理上就是字符串段;ATTRIBUTE1…15是预留自定义列,类型死板。 - Fusion 字段:比 EBS 封装深,表高度抽象,业务走 Service/VO/Entity Object,但底层仍是预置物理模型,扩展靠 EFF(Extended Flexfield)或 PVO 定制。
- MetaERP 字段:字段定义本身带类型/校验/权限/索引提示/属于哪个对象/哪个视图可见,是一等元数据。物理列由引擎决定要不要建、建哪张表(头表/明细表/维度行表)。
3. 科目与维度建模(最典型差异)
- EBS:科目+公司+部门+项目 → 拼成CCID(GL_CODE_COMBINATIONS),宽表思维,查得快但改维度=动全局。
- MetaERP:核算单元 / 自然科目 / 维度标签三层解耦,凭证头+分录行+维度行分表存,JOIN 换灵活性。
代价:EBS 固定维度查询/法定报表快;MetaERP 灵活但简单汇总要多表聚合,靠引擎优化。
四、微服务 vs Oracle 的「存储过程 / API」
1. 存储过程(PL/SQL)在 Oracle 体系里的位置
EBS 大量逻辑在数据库内:
- 校验:PL/SQL 包
- 过账:触发器 + 并发程序调用 PL/SQL
- 接口:先写接口表 → 并发请求跑 PL/SQL 搬运
- 强一致:一个 Oracle DB 事务搞定跨模块(PO→AP→GL)
Fusion 把一部分逻辑上移到应用层(ADF/Service),但核心财务/成本仍深度依赖 PL/SQL 与 Oracle DB 特性(自治库、ESS 作业)。
2. MetaERP 微服务怎么替代它
对比点 | Oracle PL/SQL / 并发程序 | MetaERP 微服务 |
|---|---|---|
逻辑位置 | 数据库内(DB 是大脑) | 服务内(DB 只存数据,GaussDB 分片) |
跨模块调用 | 同一事务跨表 UPDATE | 服务 A 写本地表 → 发事件 → 服务 B 消费 |
一致性 | ACID 单库事务 | Saga 最终一致 + 补偿事务 |
扩展方式 | 改 PL/SQL 包、建并发请求 | 加服务/加元数据/加事件处理器 |
实时性 | 批处理为主(日结、月结) | 事件驱动,交易即记账 |
对外集成 | SOAP/REST API 是“出口”,内部仍 PLSQL 主导 | API 是服务间原生协议,无“内部 PLSQL 捷径” |
多租户 | 单库多 ORG_ID | 租户级 Schema/分片,物理隔离 |
3. API 语义差异
- EBS API:如
AP_INVOICES_PKG.CREATE_INVOICE是 PL/SQL 包包装,外面套 ISG/SOA 转 Web Service;本质是“给存储过程穿 HTTP 外衣”。 - Fusion API:REST/SOAP 是标准入口,但底层仍走 Fusion 的 Entity/VO 层,不能直接 DML 基表。
- MetaERP API:API 不是“暴露老逻辑”,而是元数据引擎顺手生成的——定义对象就有 API,对象变 API 变,服务边界=API 边界。
五、一张总表收口
主题 | Oracle EBS / Fusion | 华为 MetaERP |
|---|---|---|
结构真理源 | 物理表 + 代码 + 弹性域配置 | 元数据引擎(Metadata as Source of Truth) |
加字段/对象 | DDL + 改 Form/PLSQL/并发 | 改元数据 → 引擎生成表/API/界面 |
表字段含义 | 靠段名/弹性域解释,CCID 宽表 | 字段是自描述元数据,维度解耦 |
服务边界 | 模块耦合,同库事务 | 领域微服务,独立库,事件协作 |
业务逻辑载体 | PL/SQL、触发器、并发程序 | 服务内领域代码 + 元数据规则 + 事件处理器 |
跨模块一致性 | 单库 COMMIT/ROLLBACK | Saga 补偿、最终一致 |
定制侵入性 | 改核心表/存储过程风险高 | 租户元数据层隔离,内核不动 |
实时记账 | 批量/月末 | 业务事件→会计规则服务实时出凭证 |
六、一句话类比(好记)
- EBS:Excel 模板写死列,改列要改文件结构,公式藏在 VBA 里,所有表在一个工作簿。
- MetaERP:Notion 数据库——你改“属性”配置,后端表/视图/表单/API 自动变,每个团队(微服务)有自己的子库,通过 webhook 联动。