跳到主要内容

ADR-0020:单一业务数据库(取消 martin / erd 双库)

  • 状态:已接受(2026-08-03)
  • 决策者:项目维护者

背景

应用长期使用同一 MySQL 实例上的两个库:martin(系统/认证)与 erd(建模元数据),两套 Hikari + SqlSessionFactory 按 mapper 包路由。Railway / 远程插件 MySQL 默认只有一个库名(常为 railway),双库建库与 db/init 灌数成为部署主痛点。

历史注释称 sys_user / sys_role 同名冲突导致无法合并。核查结果:

来源冲突表结论
martin完整 sys_user / sys_role(认证真相)保留
erd dump同名桩表(仅 id/username/password 等)后端 erd mapper 零引用,合并时丢弃

其余表名无交集,可同库共存。

决策

  1. 物理单一库:默认库名 erd(环境变量 MYSQLDATABASE;无 DB_ERD / DB_MARTIN / DB_NAME 回退)。
  2. db/init 仅 schema01_create_database.sql + 02_tables.sql(CREATE TABLE);不再含种子、demo、privileges 脚本。
  3. 种子进 Flywaybackend/.../db/migration/erd/V3+(系统基线 / 新用户权限 / 公开 demo / E2E 账号);后端启动由 ErdFlywayConfig 执行。
  4. 过渡期保留双 SqlSessionFactorymartinDataSourceerdDataSource 仍按包扫描分离,但 JDBC URL 指向同一 MYSQLDATABASE,凭证同为 MYSQLUSER / MYSQLPASSWORD(避免本轮拆 mapper 大爆炸)。后续可再 ADR 合并为单 DS。
  5. 环境变量:Spring 直接读 Railway 插件原生名(MYSQLHOST / MYSQLPORT / MYSQLDATABASE / MYSQLUSER / MYSQLPASSWORD),每项单一占位符、无嵌套回退。Compose:MySQL 容器用官方 MYSQL_DATABASE / MYSQL_USER / MYSQL_PASSWORD,backend 注入同名 MYSQL*

后果

  • Railway:Link MySQL 即注入 MYSQL*;建一个库 + 导入 schema;Redeploy 后 Flyway 灌种子。不再要求 DB_MARTINDB_ERD 两库,也不再要求 DB_* Variable Reference。
  • 本地已有 双库 data 卷:须重建卷(docker compose down -v 后 up)或手工把 martin.* 表迁入 erd 并改 MYSQLDATABASE=erd
  • 生产若已有双库数据:导出两边表 → 导入单一业务库(丢弃 erd 侧桩 sys_*)→ MYSQLDATABASE 指向该库 → 确认 flyway_schema_history 后按需 baseline / 补跑未执行版本。
  • E2E 种子随 Flyway 进入库;公网登录仍由 erd.security.e2e-accounts-enabled=false 拒绝。

验证

  • mvn -q -DskipTests compile
  • ./scripts/railway-mysql-init.sh --dry-run 仅列 01+02
  • 空卷 compose 首启后后端 Flyway ≥ V6;SELECT COUNT(*) FROM erd.sys_user > 0