Files
2026-02-02 11:22:35 +08:00

100 lines
4.6 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.
# DB Design & Migrations数据库设计与迁移Tasks
> 对应计划:`spec_kit/Personalized Reco/modules/db-design/plan.md`
>
> 目标:在“库为空”的前提下,落地推荐系统最小可用数据模型 + Alembic 迁移,并通过最小查询/契约验收。
---
## 0. 任务状态约定
- `[ ]`:未开始
- `[~]`:进行中
- `[x]`:已完成
- `[-]`:已取消/不做(需写明原因)
---
## 1. 环境与依赖准备
- [ ] **确认 MySQL 版本与字符集支持**
- 验收MySQL 版本为 8.x库/表可用 `utf8mb4`(建议 `utf8mb4_0900_ai_ci`)。
- [x] **后端依赖补齐 Alembic**
- 说明:`server/requirements.txt` 已包含 `alembic>=1.13`
- 验收:在 `server/.venv` 中可成功 `import alembic`
---
## 2. ORM 模型落地(推荐最小集合)
- [x] **创建 ORM 模型目录**
- 目标路径:`server/app/db/models/`
- 验收:目录存在,且可被 Python 正常 import。
- [x] **实现 `contents` 模型**
- 字段:`content_id(PK, 自增)``text_en?``text_tc?``author_id?``template_id?``created_at``updated_at`
- 索引:`author_id``template_id`
- 验收Alembic autogenerate 能识别表结构。
- [x] **实现 `content_profiles` 模型**
- 字段:`content_id(PK/FK)``stage(enum)``emotion_score(NULL=general)``context_suitability_json(JSON)``need_suitability_json(JSON)``personalization_power(0/5/10)``review_confidence?``is_safe_pool``updated_at`
- 索引:`stage``personalization_power``is_safe_pool`
- 验收Alembic autogenerate 能识别表结构;`content_id` 具备外键与级联删除。
- [x] **实现 `content_risk_flags` 模型(关联表)**
- 字段:`id(PK)``content_id(FK)``flag``created_at`
- 约束:`UNIQUE(content_id, flag)`
- 索引:`flag``content_id`
- 验收Alembic autogenerate 能识别唯一约束与索引。
---
## 3. Alembic 初始化与迁移生成
- [x] **初始化 Alembic 目录**
- 目标位置:`server/alembic/`(含 `versions/``env.py`
- 验收:在 `server/` 下可运行 `alembic -h` 且能读取配置。
- [x] **配置 Alembic 连接串来源**
- 要求:复用现有 `DATABASE_URL`(对齐 `server/app/core/config.py`
- 验收:`alembic` 命令可加载 `env.py` 并读取 `DATABASE_URL`(未连 DB 验收留到第 4 章)。
- [x] **配置 `env.py` 支持 autogenerate**
- 要求:引入 ORM `Base` 与 models确保 metadata 完整)
- 验收Alembic 能识别 `target_metadata`;且已提供初始迁移版本文件。
- [ ] **生成并执行初始迁移**
- 命令:`alembic upgrade head`
- 验收:数据库中出现 `contents``content_profiles``content_risk_flags` 与 Alembic 版本表。
---
## 4. 数据契约验收(最小入库与查询)
- [ ] **准备一条最小文案数据(人工插入或脚本)**
- 必须字段(对齐 plan`text``stage``emotion_score(可 NULL)``context_suitability_json(5 keys)``need_suitability_json(5 keys)``personalization_power(0/5/10)``risk_flags(可空)`
- 验收:可插入成功,不违反约束。
- [ ] **验证按 `content_id` 批量查询可用**
- 目标:能 join 组装出 `ContentProfile` 所需字段集合(含 risk_flags 列表)
- 验收:至少验证字段:`content_id/text/stage/emotion_score/context_suitability/need_suitability/personalization_power/risk_flags`
- [ ] **验证 Hard Filter 关键 flag 可过滤**
- 插入:至少一条带 `block_health_medical` 的记录
- 验收:通过 `content_risk_flags` 可在 SQL 层排除该内容(后续供推荐候选召回使用)。
- [ ] **验证安全池L3可用**
- 插入:至少一条 `is_safe_pool=true`
- 验收:可单独查询出安全池候选集(不依赖画像条件)。
---
## 5. 规则口径验收risk_flags 严格对齐)
- [ ] **建立 risk_flags 白名单/校验策略(写入侧或读取侧)**
- 要求flag 命名必须以 `unsafe_for_` / `block_` / `soft_` 开头(对齐 `句子文案打分规则`
- 验收:插入非法前缀时被拒绝或被修正(选择其一,并写清策略)。
- [ ] **旧 flag 兼容映射验收(若存在历史数据导入)**
- 覆盖:`block_stage_unknown``unsafe_for_stage_unknown` 等(详见 plan
- 验收:系统对外(读出/下游)不再出现旧 flag 名称。
---
## 6. 文档与交接
- [ ] **补齐本子模块 README/说明(可选,但建议)**
- 内容:如何初始化 DB、如何跑迁移、如何插入一条最小文案数据、如何验证查询。
- 验收:新同学按文档能在 30 分钟内跑通迁移 + 插入 + 查询。