refactor(schema): 迁移 043 schema 收敛——42→19 张表,统一迁移 runner
- 迁移 043 一次到位:runtime_instance/environment_binding 并入 browser_env(账号即环境)、 credential_reference 并入 social_account、work_source/metric_plan 并入 creator_work、 sync 租约并入 creator_collection_checkpoint(kind='sync')、audit_event 瘦列、 creator_settings 去转写列、TRUNCATE 账号域(竞品采集数据无损保留) - 统一迁移 runner:environment.Open 串起 001 账号基座 + hub 链 + 038 creator 版本回填 (v+1000) + creator 1017-1042 + 043;account/creator Open 不再迁移 - 三域 store SQL 全量适配:CreateBoundEnv 就绪门禁、SetRuntimeCleanupPending fence 语义(未知代 MissingRuntimeID 允许登记并释放活跃实例)、metric_plan 列并入 work、 checkpoint sync 租约、deletion 链路重写 - api 适配:envView 去 runtime_instance_id、audit filter 去任务列、browser_env 单表查询 - 测试:迁移 043 形态探针、迁移不可变映射新路径、legacy 迁移重放子测试重写、 fence/出口生命周期/单来源 upsert 语义覆盖;CREATORHUB_POSTGRES_TEST_URL 全绿, environment 70%/creator 67.5% 覆盖率,tsc 通过
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
# Schema 收敛与数字主键重构:迭代计划
|
||||
|
||||
> 状态:已评审拍板(2026-09-29)。范围:砍空转链路 → 同域合并瘦身 → 数字主键重构。
|
||||
> 前置决策记录:
|
||||
> - fingerprint seed 与账号自增 id 绑定:seed = 账号 id + 1000,创建账号时即绑定运行环境,零用户配置项。
|
||||
> - 不做存量兼容迁移:账号域历史数据直接清空(TRUNCATE);竞品采集数据无损保留。
|
||||
> - 空转链路判死:任务发布链路、自动运营链路、素材链路,从上线至今 0 条数据,直接删除(需要时从 git 历史捞回)。
|
||||
|
||||
## 1. 目标
|
||||
|
||||
1. 表从 42 张收敛到 19 张,消灭 1:1 冗余表、重复租约模式、双迁移系统。
|
||||
2. 全库数字主键:每张表 `id bigint GENERATED ALWAYS AS IDENTITY` 主键,文本业务标识降级为 UNIQUE 列,FK 全部重指 bigint。
|
||||
3. 「账号即运行环境」:创建账号即绑定环境(seed = 账号 id + 1000、网关唯一自动取、出口默认直连),账号启动/停止 = 环境启动/停止,两态开关。
|
||||
4. 删除 `/browsers` 独立菜单与创建流程,环境信息并入账号详情页。
|
||||
|
||||
## 2. 表收敛总表(42 → 19)
|
||||
|
||||
### 2.1 直接删除(14 张 + 对应代码)
|
||||
|
||||
| 表 | 连带删除 |
|
||||
|---|---|
|
||||
| content_draft、confirmation、operation_task、execution_attempt | 任务中心/草稿核对/attempt 详情 4 个页面、account store 任务链函数(28 个)、相关 API 路由 |
|
||||
| creator_event、creator_event_strategy_trace、creator_strategy、creator_operation、creator_conversation、creator_message、creator_cooldown、creator_listener_state、creator_listener_boundary | 运营工作台整套 UI、listener/策略引擎/事件处理 store 与 API |
|
||||
| creator_material_job | 素材页面、转写链路、creator_material API |
|
||||
| runtime_use_lease | runtime-use 租约机制(Acquire/Renew/Release),唯一剩余调用方「强制同步」改为直接使用环境 |
|
||||
|
||||
### 2.2 同域合并(5 张消失,信息无损)
|
||||
|
||||
| 合并 | 说明 |
|
||||
|---|---|
|
||||
| credential_reference → social_account | 加 credential_provider、credential_key 两列,删 FK |
|
||||
| environment_binding → browser_env | 加 account_id + runtime cleanup 状态列;消灭 id=account_id 假 1:1 表 |
|
||||
| creator_work_source → creator_work | work 已有 source_type/source_id 内联列,删除冗余表 |
|
||||
| creator_metric_plan → creator_work | 调度列(interval/multiplier/point_index/next_plan_at)并入 work,消灭双份调度状态 |
|
||||
| creator_source_sync_lease → creator_collection_checkpoint | 统一租约模式(lease_token/lease_until),一种写法 |
|
||||
|
||||
### 2.3 同步瘦身(3 张)
|
||||
|
||||
- audit_event:18 → 9 列(任务/草稿/确认相关列随链路删除)
|
||||
- runtime_instance → 并入 browser_env(活跃实例 1:1:runtime_id、lease_until、network_id、node_id 等 5-6 列),表删除
|
||||
- creator_competitor:sync 租约字段对齐统一租约模式
|
||||
|
||||
### 2.4 最终 19 张
|
||||
|
||||
```
|
||||
基础盘(5):social_account(含凭据引用)、gateway、network_exit、
|
||||
browser_env(含绑定+活跃实例)、audit_event(瘦列)
|
||||
监控(12):creator_competitor、creator_competitor_share_job、
|
||||
creator_work(含来源+调度)、creator_work_metric、creator_work_cover、
|
||||
creator_comment、creator_comment_rule_result、creator_lead_rule、
|
||||
creator_account_profile、creator_account_password、creator_account_metric
|
||||
运维+系统(2):creator_collection_checkpoint(统一租约)、creator_settings、schema_migration
|
||||
```
|
||||
|
||||
保持不动:creator_account_profile / creator_account_password 虽是 1:1,但归 creator 域(登录核验),跨域并入 social_account 破坏模块边界,保留。
|
||||
|
||||
## 3. 数字主键重构规则
|
||||
|
||||
- 每张表:`id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY`。
|
||||
- 文本业务标识降级 UNIQUE NOT NULL,并按语义改名(如 social_account.id → account_id、browser_env.alias 保留原名)。
|
||||
- FK 全部重指目标表 bigint id;应用层 store SQL 的 JOIN/WHERE 同步改走 bigint FK。
|
||||
- 应用层对外契约不变:API/URL/JSON 继续使用文本业务标识(`account-xxx`、alias、exit-xxx);数字 id 仅数据库内部 + seed 派生。
|
||||
- seed 派生:创建账号时读回 bigint id,`seed = id + 1000`(bigint id 范围远超 seed 上限 2147483647 的风险仅在海量账号后出现,届时再管)。
|
||||
- 存量行:PG 17 `ADD COLUMN ... IDENTITY` 自动回填 1,2,3…(已实测确认),竞品数据无需迁移脚本。
|
||||
- account/creator 双迁移系统统一:creator 域迁移并入统一 runner + schema_migration 单表登记。
|
||||
|
||||
## 4. 三阶段迭代(每阶段独立提交、独立验证)
|
||||
|
||||
### Phase 1 — 砍空转链路(纯删除)
|
||||
|
||||
1. 删 14 张表的迁移文件与建表 SQL 引用
|
||||
2. 删 account store 任务链(draft/confirm/task/attempt 全部函数与类型)
|
||||
3. 删 creator store 的运营链路(event/strategy/operation/conversation/message/cooldown/listener/material)与 API 路由
|
||||
4. 删前端:/tasks、/tasks/:id、/drafts/:id、/attempts/:id、素材页、运营工作台、菜单项与 metadata 规则
|
||||
5. 删 runtime_use_lease 机制,强制同步改为直接使用环境(同步 task 串行性由调度器保证)
|
||||
6. 测试同步删除;`go test ./...` 全绿、`tsc --noEmit` 通过
|
||||
|
||||
### Phase 2 — Schema 收敛(迁移 043 一次到位)
|
||||
|
||||
1. 迁移 043:TRUNCATE 账号域(social_account/browser_env 及其 CASCADE 链)→ 表合并/瘦列/改列
|
||||
2. 合并实现:credential_reference 并入 social_account;environment_binding + 活跃实例状态并入 browser_env;work_source/metric_plan 并入 creator_work;source_sync_lease 并入 creator_collection_checkpoint;audit_event 瘦列
|
||||
3. store SQL 全量适配(account/environment/creator 三域)
|
||||
4. 迁移不可变性测试同步更新;集成测试(CREATORHUB_POSTGRES_TEST_URL)验证合并后读写路径
|
||||
5. 「账号即环境」后端落地:创建账号即绑定(seed = 账号 bigint id + 1000、唯一网关自动取、出口直连、alias = 账号文本 ID);`POST /api/phase-a/accounts/:id/environment` 幂等补建;`POST /api/phase-a/accounts/:id/start`(resume + 启动环境);停止沿用现有 pause(已联动停环境),UI 文案改「停止」
|
||||
|
||||
### Phase 3 — 数字主键重构
|
||||
|
||||
1. 迁移:全表加 `id bigint IDENTITY` 主键,文本标识降级 UNIQUE,FK 重指
|
||||
2. 三域 store SQL:JOIN/WHERE/INSERT 全改 bigint FK;模型层补数字 id 字段(JSON 暴露 `no` 语义字段按需)
|
||||
3. 前端不动(契约不变);账号创建绑定改用 bigint id 派生 seed
|
||||
4. 全量回归:go test 覆盖率 ≥65%、tsc、手动闭环(创建账号 → 环境自动出现 → 启动 → CDP 可连 → 停止)
|
||||
|
||||
## 5. 验证标准
|
||||
|
||||
- 每阶段:`go test ./...` 全绿(相关包覆盖率 ≥65%)、`tsc --noEmit` 通过、现有 .cjs 前端测试通过
|
||||
- Phase 2 结束:真库迁移演练(开发库 + 测试 schema)确认合并后数据形态
|
||||
- Phase 3 结束:手动闭环验收(创建即绑定、两态开关、CDP 可连)
|
||||
- 迁移文件不可变测试持续生效(改内容 = 新版本号)
|
||||
|
||||
## 6. 明确不做
|
||||
|
||||
- 不保留任何已砍链路的兼容层、回退机制或迁移方案(宪法:废弃直接移除)
|
||||
- 不做 E2E 测试(宪法禁止,仅用户明确要求时)
|
||||
- 不在本轮引入多节点、认证权限、HTTPS(禁止清单)
|
||||
Reference in New Issue
Block a user