Files
wyndham-ARR/DATABASE_ARCHITECTURE_REASSESSMENT_V2.md
2026-07-29 16:38:05 +08:00

90 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ARR 数据库最终架构冻结
更新时间2026-07-28
状态:已按 `database/008_arr_mvp_v1_rebuild.sql` 实施,不再是候选方案。
## 最终数据链
```text
用户上传 XML
→ ARR 后端存入私有 OSS
→ SuperAgent 获取 XML
→ Agent 调用确定性日报 Skill
→ 生成 structured-result.json 和正式工件
→ ARR 后端重新校验 Schema、哈希、公式和处理语义
→ 单事务写入 PostgreSQL
→ 普通程序查询数据库
├─ 生成月报 XLSX
├─ 查询渠道明细/渠道 BI
└─ 生成每 10 日公司用房表
预订 Excel/当前 MD fixture
→ 私有 OSS/受控 fixture
→ 行级 Agent 解析
→ ARR 验收
→ PostgreSQL booking 来源行 + room items
→ 按 RES_COMMENT/Group Code 为报表补充 Booking Room
```
Agent、Skill 和 SuperAgent 永远不持有数据库凭据,也不直接写 PostgreSQL。ARR 后端是唯一写入方。
## 已实施的 schema 归属
| schema | 职责 |
|---|---|
| `ingestion` | 工件身份、处理运行/尝试/交付、幂等和 outbox |
| `booking` | 预订来源行、不可变解析版本、当前解析和房型明细 |
| `finance` | 日报不可变版本、全部 source outcome、渠道指标和 current 指针 |
## 关键冻结决策
1. 只使用独立 `booking_test`,不把 ARR 表放进共享维护库 `postgres`
2. 预订来源行按原 worksheet/row 逐行保存;同一 Group Code 可以重复。
3. 预订原文和完整 Agent 行级 JSON 保留,同时把 room items 结构化供查询。
4. 日报 structured-result 的全部 outcome 都落库;业务视图只读 current + retained。
5. 同日重跑形成不可变新版本,全部验收通过后才切 current失败不影响旧 current。
6. `TOTAL PRICE = REAL PRICE × NO_OF_ROOMS × NIGHTS` 由 ARR 重算并由数据库约束再次保护。
7. 精确关联键为 `upper(trim(XML.RES_COMMENT)) = booking.group_code_key`;不用 `BLOCK_CODE`,不用模糊匹配。
8. Booking 数据只补充 Booking RoomFinance 提供日期、晚数、实际房数和价格。
9. 月报、渠道明细、BI 和公司 10 日报表是程序投影,不复制一套 report rows/version facts。
10. 文件字节保存在私有 OSSPostgreSQL 只保存不可变对象身份、哈希、大小和血缘。
## 为什么保留 `artifacts`、批次和解析版本
- `ingestion.artifacts` 让 ARR 能验证 Agent 所称的 XML、日报和 JSON 是否确实是同一批交付,并实现幂等和追溯。
- `booking.source_batches/source_rows` 记录“哪一份附件、哪个 worksheet、哪一行”产生了预订信息不能只留最终 Group Code 汇总。
- `booking.parse_versions.result_json` 保存 Agent 已验收的结构化输出;`room_items` 是供普通 SQL 查询的可计算拆分。
- 这些字段是数据血缘,不是任务卡状态。
## 报表处理口径
| 输出 | 数据来源 | 是否重复落库 |
|---|---|---|
| 日报 | Agent structured-result经 ARR 验收 | 是,作为 Finance 权威日事实 |
| 月报 | current + retained 日事实,加 Booking Room | 否,程序生成 |
| 渠道明细/BI | current + retained 日事实 | 否,视图/程序查询 |
| 每 10 日公司用房表 | Finance 日期/价格 + booking 房型 | 否,程序生成 |
渠道明细的 `Total Booking Price` 直接等于对应日报行的 `total_price`,不是同 Group Code 合计,也不使用预订附件价格重算。
## 本轮明确不做
- 多酒店/多租户;
- 用户、角色和最小权限 DDL
- RSVN 任务卡;
- 邮件发件人、主题、Message-ID 等元数据;
- 报表数据库版本表;
- 日报追溯前端。
## 生产前门禁
当前使用远程测试地址和数据库 owner 用户,只用于测试;它不是面向应用的最小权限角色。生产前仍需:
- 创建 ARR writer、业务 reader 等最小权限角色;
- 接入正式私有 OSS provider/bucket 与 Secret 管理;
- 完成 SuperAgent 文件句柄、回调验签和共享幂等协议;
- 清理合成测试数据并导入真实但合规的数据;
- 做备份恢复、并发、失败注入、权限和隐私回归。
生产是否继续使用同一物理地址不是数据库模型能自动决定的事项;上线时必须显式核对环境、库名、账号和备份,不能只“清空测试数据”后默认当生产。