4.3 KiB
4.3 KiB
ARR 数据库最终架构冻结
更新时间:2026-07-28
状态:已按 database/008_arr_mvp_v1_rebuild.sql 实施,不再是候选方案。
最终数据链
用户上传 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 指针 |
关键冻结决策
- 只使用独立
booking_test,不把 ARR 表放进共享维护库postgres。 - 预订来源行按原 worksheet/row 逐行保存;同一 Group Code 可以重复。
- 预订原文和完整 Agent 行级 JSON 保留,同时把 room items 结构化供查询。
- 日报 structured-result 的全部 outcome 都落库;业务视图只读 current + retained。
- 同日重跑形成不可变新版本,全部验收通过后才切 current;失败不影响旧 current。
TOTAL PRICE = REAL PRICE × NO_OF_ROOMS × NIGHTS由 ARR 重算并由数据库约束再次保护。- 精确关联键为
upper(trim(XML.RES_COMMENT)) = booking.group_code_key;不用BLOCK_CODE,不用模糊匹配。 - Booking 数据只补充 Booking Room;Finance 提供日期、晚数、实际房数和价格。
- 月报、渠道明细、BI 和公司 10 日报表是程序投影,不复制一套 report rows/version facts。
- 文件字节保存在私有 OSS;PostgreSQL 只保存不可变对象身份、哈希、大小和血缘。
为什么保留 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 文件句柄、回调验签和共享幂等协议;
- 清理合成测试数据并导入真实但合规的数据;
- 做备份恢复、并发、失败注入、权限和隐私回归。
生产是否继续使用同一物理地址不是数据库模型能自动决定的事项;上线时必须显式核对环境、库名、账号和备份,不能只“清空测试数据”后默认当生产。