## P1 数据库基础 - zqyy_app: 创建 auth/biz schema、FDW 连接 etl_feiqiu - etl_feiqiu: 创建 app schema RLS 视图、商品库存预警表 - 清理 assistant_abolish 残留数据 ## P2 ETL/DWS 扩展 - 新增 DWS 助教订单贡献度表 (dws.assistant_order_contribution) - 新增 assistant_order_contribution_task 任务及 RLS 视图 - member_consumption 增加充值字段、assistant_daily 增加处罚字段 - 更新 ODS/DWD/DWS 任务文档及业务规则文档 - 更新 consistency_checker、flow_runner、task_registry 等核心模块 ## P3 小程序鉴权系统 - 新增 xcx_auth 路由/schema(微信登录 + JWT) - 新增 wechat/role/matching/application 服务层 - zqyy_app 鉴权表迁移 + 角色权限种子数据 - auth/dependencies.py 支持小程序 JWT 鉴权 ## 文档与审计 - 新增 DOCUMENTATION-MAP 文档导航 - 新增 7 份 BD_Manual 数据库变更文档 - 更新 DDL 基线快照(etl_feiqiu 6 schema + zqyy_app auth) - 新增全栈集成审计记录、部署检查清单更新 - 新增 BACKLOG 路线图、FDW→Core 迁移计划 ## Kiro 工程化 - 新增 5 个 Spec(P1/P2/P3/全栈集成/核心业务) - 新增审计自动化脚本(agent_on_stop/build_audit_context/compliance_prescan) - 新增 6 个 Hook(合规检查/会话日志/提交审计等) - 新增 doc-map steering 文件 ## 运维与测试 - 新增 ops 脚本:迁移验证/API 健康检查/ETL 监控/集成报告 - 新增属性测试:test_dws_contribution / test_auth_system - 清理过期 export 报告文件 - 更新 .gitignore 排除规则
86 lines
3.6 KiB
Markdown
86 lines
3.6 KiB
Markdown
# FDW 数据源迁移方案:DWD → Core
|
||
|
||
> 创建日期:2026-02-24
|
||
> 状态:已决策(上线后迭代)
|
||
> 关联 SPEC:miniapp-db-foundation
|
||
|
||
---
|
||
|
||
## 背景
|
||
|
||
当前 `miniapp-db-foundation` SPEC 中,FDW 外部表映射的数据源链路为:
|
||
|
||
```
|
||
ETL 库 dwd.dim_* / dws.dws_*
|
||
→ app.v_dim_* / app.v_dws_*(RLS 视图,site_id 过滤)
|
||
→ 业务库 fdw_etl.v_dim_* / fdw_etl.v_dws_*(FDW 外部表)
|
||
```
|
||
|
||
ETL 六层 Schema 中,`core` 层的定位是"跨门店标准化维度/事实",是 DWD 层的精简子集。长远来看,小程序读取的维度数据应从 `core` 层获取,而非直接读 `dwd` 层。
|
||
|
||
## 决策
|
||
|
||
上线时保持现状(`app` 视图指向 `dwd.*` / `dws.*`),上线后再迭代切换到 `core`。
|
||
|
||
## 理由
|
||
|
||
1. Core 层当前仅 7 张表(`dim_site`、`dim_member`、`dim_assistant`、`dim_table`、`dim_goods_category`、`fact_settlement`、`fact_payment`),小程序需要的 11 张 DWD + 24 张 DWS 远超 Core 覆盖范围
|
||
2. Core 层字段是精简子集(如 `core.dim_member` 无 `card_balance`、`total_consumption` 等),小程序前期需要 DWD 的完整字段
|
||
3. `app` 视图层本身就是抽象层——后端通过 `fdw_etl.v_dim_member` 访问数据,底层视图定义可随时切换,后端代码零改动
|
||
4. 上线关键路径是 P0 阶段(基础设施 → 微信配置 → 后端核心功能),Core 层完善属于 P2 范畴
|
||
|
||
## 迁移路径
|
||
|
||
### Phase 0:上线前(当前)
|
||
|
||
按 SPEC 原样执行:
|
||
- `app.v_dim_member` → `SELECT * FROM dwd.dim_member WHERE site_id = ...`
|
||
- `app.v_dws_*` → `SELECT * FROM dws.dws_* WHERE site_id = ...`
|
||
- FDW 通过 `IMPORT FOREIGN SCHEMA app` 映射
|
||
|
||
### Phase 1:上线后 — 补齐 Core 层表
|
||
|
||
- 盘点小程序实际用到的维度表,确认 Core 层需要补齐哪些字段
|
||
- 对照 DWD 层的 `dim_member`、`dim_assistant` 等,在 Core 层补全小程序所需的业务字段
|
||
- 新增 Core 层缺失的维度表(如 `core.dim_member_card_account`、`core.dim_staff` 等)
|
||
|
||
### Phase 2:上线后 — ETL 填充任务
|
||
|
||
- 在 ETL Connector 中新增 DWD → Core 的填充任务
|
||
- 确保 Core 层数据与 DWD 层保持同步
|
||
- 验证 Core 层数据完整性和正确性
|
||
|
||
### Phase 3:上线后 — 切换视图定义
|
||
|
||
- 修改 `app` 视图定义,将维度表从 `dwd.*` 切换到 `core.*`:
|
||
```sql
|
||
-- 修改前
|
||
CREATE OR REPLACE VIEW app.v_dim_member AS
|
||
SELECT * FROM dwd.dim_member
|
||
WHERE site_id = current_setting('app.current_site_id')::bigint;
|
||
|
||
-- 修改后
|
||
CREATE OR REPLACE VIEW app.v_dim_member AS
|
||
SELECT * FROM core.dim_member
|
||
WHERE site_id = current_setting('app.current_site_id')::bigint;
|
||
```
|
||
- DWS 汇总表保持不变(它们本身就在 DWS 层,Core 层不涉及汇总)
|
||
- 重新执行 `IMPORT FOREIGN SCHEMA app INTO fdw_etl` 同步外部表
|
||
- 后端和小程序代码无需任何改动
|
||
|
||
## 风险与缓解
|
||
|
||
| 风险 | 缓解措施 |
|
||
|------|---------|
|
||
| Core 层字段不全导致小程序功能缺失 | Phase 1 先盘点再补齐,确保字段覆盖 |
|
||
| DWD → Core 填充任务引入数据延迟 | Core 填充任务纳入 ETL 调度链,与 DWD 同步执行 |
|
||
| 切换视图时短暂不可用 | 使用 `CREATE OR REPLACE VIEW` 原子替换,无停机 |
|
||
| Core 层数据与 DWD 不一致 | 切换前运行数据一致性校验脚本 |
|
||
|
||
## 关键设计优势
|
||
|
||
`app` 视图层是整个方案的"切换开关":
|
||
- 后端只看到 `fdw_etl.v_dim_member`,不关心底层是 DWD 还是 Core
|
||
- 切换只需修改视图 SQL + 重新 IMPORT,零代码改动
|
||
- 可以逐表切换(先切 `dim_member`,验证通过后再切其他表),降低风险
|