[M-AI-02-01] 审计现有 AI Job Schema、数据规模与兼容依赖 #273
Closed
opened 2026-06-19 23:30:03 +08:00 by wangdl
·
10 comments
Labels
Clear labels
adr
Area: adr
architecture
Area: architecture
area:activity
活动/统计
area:admin
管理后台
area:admin-api
area:ai
AI/RAG
area:ai-runtime
AI Runtime / AI 分析体系相关
area:analytics
area:api
API 接口
area:auth
认证与授权
area:cos
对象存储
area:database
数据库/Migration
area:import
文件导入/解析
area:knowledge
知识库/知识点
area:learning-info
area:learning-session
area:quiz
测验/自测
area:reading-event
area:reading-progress
area:review
复习系统
area:security
安全相关
audit
Area: audit
audit:api-admin-info
audit:api-info
audit:planned
已完成宏观规划,尚未代码审查
audit:reviewed
backend
Area: backend
billing
Area: billing
blocked-by:api-info-aggregation
blocked-by:api-info-core
blocked-by:api-info-ops
blocked-by:api-info-schema
blocked-by:processor
blocked-by:schema
compatibility
Area: compatibility
gate
Area: gate
infrastructure
Area: infrastructure
priority:p0
最高优先级,阻塞发布
priority:p1
高优先级,里程碑必需
priority:p2
中优先级,后续版本
prisma
Area: prisma
release
Area: release
repo:api
API 仓库 Issue
status:blocked
被阻塞
status:done
已完成
status:partial
status:todo
type:aggregation
type:bug
缺陷修复
type:design
设计
type:docs
文档
type:feature
新功能
type:migration
type:refactor
重构
type:test
work:admin-api
work:aggregation
work:api
work:artifact
题目/卡片产物
work:audit
work:circuit-breaker
熔断
work:contract
work:design
架构/协议设计工作
work:docs
work:export
work:extend-existing
work:internal-api
Runtime 内部接口
work:job
Job 调度相关
work:new-module
work:new-table
work:ops
work:query
work:quota
额度/限流
work:schema
Prisma Schema 设计
work:security
work:service
Service 层实现
work:snapshot
Snapshot 构建
work:test
Milestone
No items
No Milestone
M-AI-02 统一 AiJob 数据库 Expand
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: wangdl/api-server#273
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
依赖
目标
在修改 Prisma 前,完整确认现有
AiAnalysisJob、AiAnalysisResult、AiRuntimeJob、AiUsageLog的物理结构、数据规模、调用方和外键依赖。审计内容
Schema
逐字段输出:
数据
在生产只读查询:
调用方
搜索所有:
prisma.aiAnalysisJobAiAnalysisJobAiAnalysisJobStatus兼容风险
明确:
输出
新增:
非目标
验收
所有结论附:
无法确认的必须标记为"无法确认",禁止猜测。
[M-AI-02] 审计现有 AI Job Schema、数据规模与兼容依赖to [M-AI-02-01] 审计现有 AI Job Schema、数据规模与兼容依赖开发完成评论
完成内容
AiAnalysisJob(13字段)、AiAnalysisResult(14字段)、AiRuntimeJob(31字段)、AiRuntimeResult(14字段)、AiUsageLog(15字段) 的完整物理结构AiAnalysisJob: pending/processing/completed/failed/queued;AiRuntimeJob: pending/locked/running/succeeded/failed/cancelled)均为 raw string,无 enum 定义prisma.aiAnalysisJob访问点、4 个prisma.aiAnalysisResult、22 个prisma.aiRuntimeJob、6 个prisma.aiUsageLogAiUsageLog与 Job 表无 FK 关联修改文件
docs/architecture/m-ai-02-current-schema-audit.md(新增,403行)代码证据
prisma/schema.prisma:567-588:AiAnalysisJobmodel 定义prisma/schema.prisma:590-612:AiAnalysisResultmodel 定义prisma/schema.prisma:1883-1929:AiRuntimeJobmodel 定义(31字段)prisma/schema.prisma:1933-1955:AiRuntimeResultmodel 定义prisma/schema.prisma:768-790:AiUsageLogmodel 定义prisma/migrations/20250516000000_init/migration.sql:300-319:AiAnalysisJob物理建表prisma/migrations/20250516000000_init/migration.sql:322-342:AiAnalysisResult物理建表src/modules/ai-analysis/ai-analysis.repository.ts:6个 Prisma 访问点src/modules/ai-runtime/internal/runtime-internal.service.ts:AiRuntimeJob最大调用方(22个访问点)test/helpers/integration-harness.ts:228:唯一硬编码表名字符串"AiAnalysisJob","AiAnalysisResult"docs/architecture/adr-001-unified-ai-architecture.md:确认系统B "无任务生产者"测试情况
npx jest --testPathPatterns="ai-analysis|ai-runtime" --passWithNoTests未完成 / 风险
是否建议进入 Review
B1 修复:B1 已解决 — 生产数据审计已完成
通过 SSH 隧道连接生产 MySQL(蜂驰云 8C,zhixi_prod @ 120.53.227.155:3306),完成了第 4 节「数据」审计的全部 8 项要求。
关键数据
对 M-AI-02 后续决策的影响
审计文档已更新:
docs/architecture/m-ai-02-current-schema-audit.md第 4 节。B2 修复:B2 已解决 — 全部 7 个 FK 约束已从 INFORMATION_SCHEMA 核实并补充
问题根因
1.3(AiRuntimeJob)、1.4(AiRuntimeResult)、1.5(AiUsageLog)的 FK 信息仅从 Prisma schema 推定(这些 relation 在 schema 中未显式声明
onDelete/onUpdate),未查阅 Migration SQL 和实际数据库。修复内容
通过
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS查询生产数据库,确认了全部 7 个 FK 约束:一致性结论:全部 5 表的 FK 策略统一为
ON DELETE RESTRICT + ON UPDATE CASCADE,这意味着删除用户前必须清理关联的 AI Job/Result/Usage 记录。M-AI-02 Expand 新增 FK(如AiUsageLog.jobId)应保持此策略一致。审计文档已更新:
docs/architecture/m-ai-02-current-schema-audit.md1.3、1.4、1.5 节。N1 修复:N1 已解决 — 调用方计数已修正
开发评论中的"22 个 prisma.aiRuntimeJob 访问点"为错误数字。
精确计数(源文件)
user-ai.service.tsruntime-internal.service.tsjob-reaper.service.tsplatform-budget.service.ts审计文档 5.3 节的表格行数(14 行)正确覆盖了全部 29 个源文件访问点,仅开发评论中的总结数字 22 有误。
N4+N5 修复
N4:FK 约束来源已标注
审计文档新增 1.6 节「FK 约束来源:Prisma 隐式默认 vs 显式声明」。
关键发现:全部 7 个
@relation在 Prisma schema 中均未显式声明onDelete/onUpdate,生产中的 RESTRICT/CASCADE 来自 Prisma 默认行为。对 M-AI-02-03/04 的建议:
onDelete: Restrict, onUpdate: Cascade,避免依赖 Prisma 默认值(不同版本/方言可能不同)AiUsageLog.jobId(M-AI-02-08)需特别评估onDelete: SetNullvsRestrict——删除 Job 时 UsageLog 应保留以维持计费审计OutboxEventFK(M-AI-02-07)应为onDelete: CascadeN5:事件订阅链已完整追踪
审计文档 7.7 节 新增完整的 4 层调用链路:
关键发现:
ReviewCard无jobIdFK — 无法溯源卡片生成来源AIAnalysisCompletedevent 类完全耦合FocusItem不走事件系统 — Worker 进程内直接同步调用(无可靠投递保证)详细文件追踪(含行号)见审计文档。
边界条件已补充
孤儿外键检测
5 个检测 SQL 已列入审计文档(LEFT JOIN + IS NULL 标准模式),覆盖全部跨表 FK 关系:
AiAnalysisResult.jobId → AiAnalysisJob.id:0 孤儿AiAnalysisResult.userId → User.id:0 孤儿AiAnalysisJob.userId → User.id:0 孤儿AiUsageLog.userId → User.id:0 孤儿(FK RESTRICT 保证)重复业务记录
定义了"重复"的判定标准:同一用户对同一 jobType 在 1 秒内创建 ≥2 条记录。
检测结果:发现 1 对并发重复(2 个 feynman-evaluation Job,同一用户,0 秒间隔,均为 completed)。
根因:
AiAnalysisJob表无(userId, sessionId, jobType)唯一约束,无法在 DB 层防并发。M-AI-02-03 引入idempotencyKey后可通过业务层幂等解决。JSON/TEXT 字段最大容量
10 个字段的
MAX(LENGTH())检测 SQL 及结果已列入审计文档。关键结论:
TEXT/JSON类型即可AiJobSnapshot需容纳完整 snapshot JSON(预估 5-10KB),建议MEDIUMTEXTN6 修复:N6 已解决 — 测试文件 Raw SQL 引用计数已修正
修正前后对比
api-e2e.worker-int-spec.tsworker-integration.worker-int-spec.ts遗漏根因
初次审计只 grep 了包含
SELECT ... FROM AiAnalysisJob的行,遗漏了:dbQuery(DB_URL, "...")中的 SQL 参数)console.log中的表名字符串it()测试描述中的表名修复
审计文档 6 节和 7.5 节已更新为精确的 37 处引用计数(含完整行号列表)。
N7 修复:N7 已解决 — completedAt NULL 分析矛盾已消除
问题
原文本推测
completedAt0 NULL 可能来自CURRENT_TIMESTAMP默认值或@updatedAt的副作用,造成内部矛盾。事实
AiAnalysisRepository.updateJobStatus()对completed和failed均显式设置completedAt = new Date()(ai-analysis.repository.ts:23-24)completed+ 4failed),无pending/processing滞留DateTime?不生成DEFAULT CURRENT_TIMESTAMP@updatedAt仅影响updatedAt列,不影响completedAt结论:0 NULL 是完全正确的值,非巧合。
修复
docs/architecture/m-ai-02-current-schema-audit.md:271已替换为基于代码事实的精确解释。N8+N9 修复
N8:审计脚本凭据已移除
scripts/query-audit-data.ts:3:硬编码DATABASE_URL已替换为process.env.DATABASE_URL || "mysql://user:password@127.0.0.1:3306/zhixi".gitignore已加入scripts/目录,防止意外提交N9:审计文档内部数字一致性
N6 修复时已同步更新:
最终修正
1. AiUsageLog 成功率根因
审计文档已显式链接低成功率与 MiniMax 到期事实:
minimax-m2.759 次调用 100% 失败 ⟵ MiniMax 2.7 API Key 已于 2026-06-06 到期(devops轻量云服务器凭据.md确认)learning-trend全部使用 minimax → 失败率 84%knowledge-import大量使用 minimax → 失败率 93%deepseek-v4-pro/deepseek-v4-flash)近乎 100% 成功结论:排除 MiniMax 到期影响后,DeepSeek 成功率达 ~100%。生产已全量切换至 DeepSeek,M-AI-02 无需为 Minimax 保留兼容。
2. 审计人标记
第 4 行已从"自动化审计"修正为"半自动化审计(代码扫描 + 生产 MySQL 只读查询 via SSH 隧道)"。