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

4.6 KiB
Raw Permalink Blame History

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)。
  • 后端依赖补齐 Alembic
    • 说明:server/requirements.txt 已包含 alembic>=1.13
    • 验收:在 server/.venv 中可成功 import alembic

2. ORM 模型落地(推荐最小集合)

  • 创建 ORM 模型目录
    • 目标路径:server/app/db/models/
    • 验收:目录存在,且可被 Python 正常 import。
  • 实现 contents 模型
    • 字段:content_id(PK, 自增)text_en?text_tc?author_id?template_id?created_atupdated_at
    • 索引:author_idtemplate_id
    • 验收Alembic autogenerate 能识别表结构。
  • 实现 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_poolupdated_at
    • 索引:stagepersonalization_poweris_safe_pool
    • 验收Alembic autogenerate 能识别表结构;content_id 具备外键与级联删除。
  • 实现 content_risk_flags 模型(关联表)
    • 字段:id(PK)content_id(FK)flagcreated_at
    • 约束:UNIQUE(content_id, flag)
    • 索引:flagcontent_id
    • 验收Alembic autogenerate 能识别唯一约束与索引。

3. Alembic 初始化与迁移生成

  • 初始化 Alembic 目录
    • 目标位置:server/alembic/(含 versions/env.py
    • 验收:在 server/ 下可运行 alembic -h 且能读取配置。
  • 配置 Alembic 连接串来源
    • 要求:复用现有 DATABASE_URL(对齐 server/app/core/config.py
    • 验收:alembic 命令可加载 env.py 并读取 DATABASE_URL(未连 DB 验收留到第 4 章)。
  • 配置 env.py 支持 autogenerate
    • 要求:引入 ORM Base 与 models确保 metadata 完整)
    • 验收Alembic 能识别 target_metadata;且已提供初始迁移版本文件。
  • 生成并执行初始迁移
    • 命令:alembic upgrade head
    • 验收:数据库中出现 contentscontent_profilescontent_risk_flags 与 Alembic 版本表。

4. 数据契约验收(最小入库与查询)

  • 准备一条最小文案数据(人工插入或脚本)
    • 必须字段(对齐 plantextstageemotion_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_unknownunsafe_for_stage_unknown 等(详见 plan
    • 验收:系统对外(读出/下游)不再出现旧 flag 名称。

6. 文档与交接

  • 补齐本子模块 README/说明(可选,但建议)
    • 内容:如何初始化 DB、如何跑迁移、如何插入一条最小文案数据、如何验证查询。
    • 验收:新同学按文档能在 30 分钟内跑通迁移 + 插入 + 查询。