Appearance
数据库表设计 × AI
表为 API 服务:列与响应字段可追溯;脚本可重复执行;seed 先查再插。
AI CODING · 场景三 · 数据模型
先服务主路径只读。用户系统、权限大表一律后置。把「可重复」写进给 AI 的 Prompt,否则 AI 很容易写出只能跑一次的脚本。
表 2seed 幂等时间 半晚~一晚
本节要点
- meal_scenes / dishes 最小表与列 ↔ JSON 对照
- 幂等 seed 模式 + 可粘贴 Prompt
- 空库执行两次 seed 的验收剧本
最小表
| 表 | 关键列 | 说明 |
|---|---|---|
| meal_scenes | id PK, label | 用餐场景字典 |
| dishes | id PK, scene_id FK/索引, title, summary, body, reason, tip | 菜品内容 |
ER 文字版
text
meal_scenes 1 ──< dishes
id scene_id
label title / summary / body / reason / tip列 ↔ API 对照
| 列 | API JSON | 说明 |
|---|---|---|
| meal_scenes.id | id | 与前端 MealSceneId 字符串一致 |
| meal_scenes.label | label | 展示名 |
| dishes.scene_id | sceneId | 命名转换写进代码一层 |
| dishes.body | body | 详情正文;列表用 summary |
| reason / tip | reason / tip | 与前端 Mock 对齐;若曾用 notice/hint,在对照表写死映射 |
常见翻车 前端
sceneIds: []、库表单 scene_id、API 又输出 scene——三套名字。Prompt 必须贴对照表。 建表示意(SQL 草案,按引擎调整)
sql
CREATE TABLE IF NOT EXISTS meal_scenes (
id TEXT PRIMARY KEY,
label TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS dishes (
id TEXT PRIMARY KEY,
scene_id TEXT NOT NULL,
title TEXT NOT NULL,
summary TEXT NOT NULL,
body TEXT NOT NULL,
reason TEXT NOT NULL,
tip TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_dishes_scene
ON dishes(scene_id);Seed 幂等模式
text
for each row:
if exists by id → skip
else insert禁止「每次 truncate 全表」作为默认教学路径(演示环境可另说,但要写明)。
seed 至少覆盖:solo 场景 + dish-tomato-egg(或你合同里的默认菜),保证主路径 curl 非空。
跟做步骤
- 确认上一页内存 API curl 已绿。
- 贴下方给 AI 的 Prompt;先看 ER + seed 样例行。
- 确认后落表 / 迁移 / seed;API 改读库。
- 空库跑两次 seed,行数不翻倍。
- 再跑 dishes curl;全绿进 部署。
给 AI 的 Prompt
给 AI · Prompt · 表 + 迁移 + seed + 接 API
text
【目标】落 meal_scenes / dishes 表;seed 覆盖主路径;三个只读 API 改读库。
【约束】
- 建表/迁移可重复执行
- seed 可重复;业务主键不重复插入
- 附列 ↔ JSON 对照表
- 分层:repository 读库,service 组装响应,路由保持薄
【不要】用户表、权限表、上微服务、换数据库引擎(除非仓库已定)
【不要】stages / recommendations 旧表名(本切片是用餐场景 / 菜品)
【请你】
1. ER 说明 + 建表草案
2. seed 样例 2 行(我看结构)
3. 确认后再落文件并改读取路径
4. 给出:空库执行两次 seed 的预期验收剧本
bash
# 1) 按 README 建表
# 2) seed 第一次
# 3) seed 第二次 —— 行数不应翻倍
curl -s "http://127.0.0.1:8000/api/dishes?scene=solo" | python -m json.tool | head
curl -s http://127.0.0.1:8000/api/dishes/dish-tomato-egg | python -m json.tool | head- [ ] 空库一次成功;再执行一次不炸、不翻倍
- [ ] 过滤与详情字段与合同一致
- [ ] README 写清「如何重置本地库」(可选,教学友好)
纠错
| 现象 | 话术 |
|---|---|
| 第二次 seed 主键冲突 | 「改成先查再插;不要裸 insert。」 |
| API 仍读内存 | 「指出仍用内存的文件,改成走 repository。」 |
| JSON 仍是 snake_case | 「在 service 做映射,路由层不要散落 rename。」 |
| 表名又变回 stages | 「本切片表名 meal_scenes / dishes,与合同一致。」 |
下一页:部署上线。