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 零引用,合并时丢弃 |
其余表名无交集,可同库共存。
决策
- 物理单一库:默认库名
erd(环境变量MYSQLDATABASE;无DB_ERD/DB_MARTIN/DB_NAME回退)。 db/init仅 schema:01_create_database.sql+02_tables.sql(CREATE TABLE);不再含种子、demo、privileges 脚本。- 种子进 Flyway:
backend/.../db/migration/erd/的V3+(系统基线 / 新用户权限 / 公开 demo / E2E 账号);后端启动由ErdFlywayConfig执行。 - 过渡期保留双 SqlSessionFactory:
martinDataSource与erdDataSource仍按包扫描分离,但 JDBC URL 指向同一MYSQLDATABASE,凭证同为MYSQLUSER/MYSQLPASSWORD(避免本轮拆 mapper 大爆炸)。后续可再 ADR 合并为单 DS。 - 环境变量: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_MARTIN≠DB_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拒绝。