智慧餐厅 MySQL 5.6 / 达梦 DM8 双数据库兼容实施方案(待评审)

版本:v0.2,2026-09-28。目标代码仓库:store、ai_api。本文件是应用兼容改造方案,不代表代码已改造、客户环境已切换或业务已验收。v0.2 按用户确认修正:以现有 MySQL 5.6 业务行为为基线,不另造达梦专属业务规则。

一、目标与边界

同一产品版本按客户部署配置选择数据库,不为 MySQL 客户和达梦客户维护两套业务代码。一个客户环境只选择一种数据库产品:

客户选择 store 主库 ai_api 主库 双方跨库访问
MySQL 5.6 MySQL zhct MySQL aizhct 指向该客户的两套 MySQL 库
达梦 DM8 达梦 ZHCT_COMPAT 类实例 达梦 AIZHCT_COMPAT 类实例 指向该客户的两套达梦库

用户已确认:同一客户只选 MySQL 5.6 或只选达梦,store 与 ai_api 跟随同一选型。不做“每次请求动态切库”、MySQL 与达梦双写、实时同步或混搭。已有 MySQL 客户改库和历史数据割接不在本轮范围内,需另立项目。

二、当前事实与最重要的风险

证据等级 A:本地仓库 store@e2f567623、ai_api@f6aeef3b(均在 develop_dameng,当前与各自 master 同提交)的只读检查;达梦迁移验收记录。B:项目 README/运行说明。C:达梦官方 PHP 接口文档与PHP 编程指南。以下静态扫描计数是定位线索,不是完整兼容缺陷数。

三、目标技术结构

1. 部署时选型,运行时固定

每套部署提供 DB_VENDOR=mysql|dm,由交付环境注入两组连接:STORE_DB_* 与 AI_DB_*。两应用加载相同的客户选型,但各有自己的主连接,并保留必要的跨库连接。账号最小权限、密码只放私有配置/密钥管理,不进入 Git、日志和安装包示例。

启动健康检查必须输出已选数据库类型、脱敏目标和版本;两个连接都真实 SELECT 验证,失败则启动失败或明确报告不可用,禁止退回 MySQL、静默读空或误连另一个客户库。前端不做数据库类型分支,API 业务响应与数据形态应保持一致。

2. 两个框架各有可维护的 DM 适配层

为 ThinkPHP 5 和 ThinkPHP 6 分别封装达梦连接器与 SQL Builder;共用一份兼容行为规范和测试用例,而不是强行复用不兼容的框架代码。首个技术门禁是官方 PHP 驱动连通、参数绑定、事务、字段元数据、自动编号、分页及中文/CLOB 往返。MySQL 路径保持原连接器和现有 SQL 行为;达梦路径只在 DB_VENDOR=dm 激活。

逐类建立适配清单:

类别 必须验证的具体行为
连接/ORM PDO 驱动加载、连接池、超时/重连、前缀、字段缓存、大小写、列名与类型回传、受影响行数
查询 分页/排序、IN、聚合、日期格式、去重、模糊匹配、空值、别名、保留字、原生 SQL
写入 自增 ID/批量插入、忽略冲突或 upsert、默认值、更新时间、乐观/悲观锁、事务和回滚
数据 金额精度、日期/时区、零日期 NULL、布尔/枚举、空字符串、中文排序、长文本/JSON
跨库 store → AI、AI → store 的读取与双库写入;复现 MySQL 当前提交顺序、幂等/补偿与对账,再核对 DM 差异

3. 双轨数据库变更

后续版本的每一个逻辑数据库变更都应有同版本的 mysql 与 dm 脚本(必要时分别为 store/ai_api),并在空库初始化、已有库升级两条路径执行。禁止把 MySQL DDL 原样发送给达梦,也禁止应用启动时偷偷改表。每次升级保留前置条件、目标版本、幂等或防重入规则、备份/回滚说明和双引擎验证记录。

四、实施顺序与每阶段交付门禁

阶段 交付切片 完成门槛
P0 事实盘点与驱动 PoC 冻结 PHP/DM 版本;枚举全部数据库连接、原生 SQL、DDL、定时任务、跨库写入;以现有 MySQL 成功路径和异常路径建立基线;两版本 PHP 在隔离容器中加载匹配 PDO_DM 两应用均可分别连本次两套达梦测试库;参数、事务、中文/大字段/自增/字段信息的最小测试通过;产出逐文件改造清单。驱动不兼容即停止应用改造,不用未验证第三方驱动替代
P1 连接与只读链路 实现两框架 DM Connector/Builder、部署配置和跨库连接;首条纵向链路选登录→权限→人员/餐单查询 MySQL 5.6 与 DM8 各跑一次同一套 API 契约测试;响应字段/类型/数据范围一致;数据库断连明确报错
P2 核心写入链路 按餐单/菜品→下单/结算→卡务/余额/补贴→AI 推荐的业务顺序改造,每条先冻结 MySQL 行为再复现于 DM 两引擎分别通过成功、重复请求、权限、并发、单库/跨库失败与重试测试;金额与订单状态逐条对账;既有缺陷双方共修并单独评审,不得调用真实支付或真实设备产生副作用
P3 长尾与运维链路 报表/导出、定时任务、批处理、设备/API、审计和所有版本 SQL;补齐 175 列更新时间策略及数据边界 双引擎功能矩阵无 P0 未测项;报表和异步导出结果同口径;空库安装与升级演练通过
P4 发布验收 同代码版本、两套部署包/配置模板;压测、备份恢复演练、安全检查、回滚演练与交付文档 MySQL 5.6 既有核心回归零退化,DM8 核心场景 100% 通过;无未关闭 P0/P1 缺陷;达到项目约定 SLA 后才能声明“双数据库兼容”

优先完成 P0 后再给出可信工期和人天;当前没有全量 SQL 清单、驱动 PoC 和性能基线,直接承诺总工期不可靠。建议以 2 名后端(store、ai_api 各一名)、1 名测试和 1 名交付/DBA 参与 P0/P1 评审;后续投入按改造清单确定。

五、双数据库验收矩阵

同一 Git 提交、同一应用接口契约,分别部署到独立的 MySQL 5.6 与 DM8 测试环境。每个用例记录 tested-pass、tested-fail、not-tested 或 not-applicable,保留请求/响应脱敏对比、SQL/日志、数据前后值和代码版本。

场景 MySQL 5.6 DM8 关键断言
启动、登录、角色/门店权限 必测 必测 不串客户/门店,错误时不返回空成功
菜品、餐单、人员、营养推荐 必测 必测 数据过滤、日期和排序、中文/长文本同口径
下单、结算、卡务、余额、补贴/退款 必测 必测 金额精度、状态、幂等、双库失败恢复一致
列表、分页、汇总、异步导出 必测 必测 总数、金额、字段、排序与导出一致
定时任务、批处理、设备回调 必测 必测 不重复写、可重试、可审计;外部副作用隔离
初始化、升级、备份/恢复、断连 必测 必测 可重复安装/升级,失败可恢复,密码不泄露

性能阈值应先在同规格环境测得 MySQL 基线,再由业务方签订并发、数据量、p95 延迟、错误率和持续运行时间;不能用“运行起来了”代替性能验收。测试覆盖至少包括零日期转 NULL 的生日/餐单分支、枚举约束、前缀索引查询、跨实例事务和 ON UPDATE 更新时间。

六、AI 可执行 Use Case 草案

UC-DBCOMPAT-001:交付人员为客户选择数据库并运行智慧餐厅。 版本 v0.2;状态 Draft;DoR: BLOCKED(技术验证项未关闭)。

七、评审与下一步

部署模式和“业务逻辑沿用现有 MySQL”已由用户确认,不再要求用户重新选择或设计业务规则。技术负责人应先核对 MySQL 当前跨库行为并在隔离环境验证关键失败点;随后在任务分支/独立 worktree 中实施 PoC,分别验证 PHP 7.3/7.4 达梦驱动和两框架最小读写。PoC 通过后输出逐文件风险清单、可排期任务和双库验收用例,再进入正式开发。业务代码与数据库在本方案阶段均未改动。

人审状态:待用户/技术负责人评审。认可的结论再进入开发任务;本文件中的待确认项不能由 Agent 猜测为既定规则。