33 KiB
Tool模块数据库字典文档
慢生活智能营养专家 v2.0
文档版本:v1.0
更新时间:2025-01-XX
目录
概述
本文档详细说明了Tool模块的所有数据库表结构,包括字段定义、数据类型、约束条件、索引等信息。
命名规范:
- 新建表统一使用
v2_前缀 - 现有表通过扩展字段支持新功能(
eb_user_sign、eb_article、eb_user_integral_record) - 字段名使用下划线命名(snake_case)
- 主键统一使用
表名_id格式(如result_id、plan_id)
表分类:
- 现有表扩展:
eb_user_sign(打卡)、eb_article(AI视频)、eb_user_integral_record(积分流水) - 新建表:所有
v2_前缀的表
数据类型说明:
BIGINT:大整数,用于ID字段INT:整数,用于计数、状态码等DECIMAL(M,N):精确小数,用于金额、重量等VARCHAR(N):可变字符串TEXT:长文本TIMESTAMP:时间戳DATE:日期TINYINT(1):布尔值(0/1)
表结构说明
0. 现有表扩展字段
0.1 eb_user_sign(用户签到表 - 扩展字段用于打卡功能)
表说明:使用现有 eb_user_sign 表,通过扩展字段支持饮食打卡功能。打卡记录使用 type=3 标识。
扩展字段(用于打卡功能,type=3时):
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| plan_id | BIGINT | 否 | NULL | 关联的营养计划ID |
| meal_type | VARCHAR(20) | 否 | NULL | 餐次:breakfast(早餐)/lunch(午餐)/dinner(晚餐)/snack(加餐),打卡时必填 |
| photos_json | TEXT | 否 | NULL | 饮食照片URL数组(1-3张),JSON格式 |
| notes | TEXT | 否 | NULL | 备注说明(支持语音转文字) |
| voice_url | VARCHAR(500) | 否 | NULL | 语音备注原始文件URL |
| ai_recognized_foods_json | TEXT | 否 | NULL | AI识别的食物列表,JSON格式:[{name, weight, unit, confidence}] |
| ai_recognition_status | VARCHAR(20) | 否 | 'pending' | AI识别状态:pending(待识别)/success(成功)/failed(失败) |
| ai_recognition_time | TIMESTAMP | 否 | NULL | AI识别完成时间 |
| is_manually_corrected | TINYINT(1) | 否 | 0 | 用户是否手动修正了AI识别结果:0=否,1=是 |
| recommended_dishes_json | TEXT | 否 | NULL | 推荐菜品(来自营养计划),JSON格式 |
| actual_dishes_json | TEXT | 否 | NULL | 实际食用(由AI识别结果生成),JSON格式 |
| actual_protein | DECIMAL(5,1) | 否 | NULL | 实际蛋白质摄入(g) |
| actual_energy | INT | 否 | NULL | 实际能量摄入(kcal) |
| actual_potassium | INT | 否 | NULL | 实际钾摄入(mg) |
| actual_phosphorus | INT | 否 | NULL | 实际磷摄入(mg) |
| actual_sodium | INT | 否 | NULL | 实际钠摄入(mg) |
| target_protein | DECIMAL(5,1) | 否 | NULL | 目标蛋白质摄入(g) |
| target_energy | INT | 否 | NULL | 目标能量摄入(kcal) |
| compliance_rate | INT | 否 | NULL | 整体达标率(%) |
| report_id | VARCHAR(50) | 否 | NULL | 报告编号,如:R20251120081501 |
| report_pdf_url | VARCHAR(500) | 否 | NULL | PDF报告下载链接 |
| report_generated_at | TIMESTAMP | 否 | NULL | 报告生成时间 |
| report_download_count | INT | 否 | 0 | 报告下载次数 |
| report_share_count | INT | 否 | 0 | 报告分享次数 |
| ai_comments_json | TEXT | 否 | NULL | AI生成的点评,JSON格式 |
| nutrition_score | INT | 否 | NULL | 营养评分(0-100) |
| copied_from_sign_id | INT | 否 | NULL | 复制自哪条签到记录ID(关联eb_user_sign.id) |
| is_copied | TINYINT(1) | 否 | 0 | 是否为复制的打卡:0=否,1=是 |
索引:
- UNIQUE KEY
uk_uid_date_meal(uid,create_day,meal_type,type) - INDEX
idx_plan_id(plan_id) - INDEX
idx_meal_type(meal_type) - INDEX
idx_report_id(report_id) - INDEX
idx_nutrition_score(nutrition_score) - INDEX
idx_copied_from(copied_from_sign_id)
业务说明:
- 打卡记录使用
type=3标识 - 同一用户同一天同一餐次只能打卡一次(唯一约束)
create_day字段用于打卡日期
0.2 eb_article(文章内容表 - 扩展字段用于AI视频功能)
表说明:使用现有 eb_article 表,通过扩展字段支持AI视频功能。视频类型使用 type=2 标识。
扩展字段(用于AI视频功能,type=2时):
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| post_id | BIGINT | 否 | NULL | 关联的社区内容ID(v2_community_posts.post_id,如果是从社区内容生成) |
| check_in_record_id | INT | 否 | NULL | 关联的打卡记录ID(eb_user_sign.id,当type=2时) |
| thumbnail_url | VARCHAR(500) | 否 | NULL | 视频缩略图URL(当type=2时,可用image_input代替) |
| duration | INT | 否 | NULL | 视频时长(秒) |
| file_size | BIGINT | 否 | NULL | 视频文件大小(字节) |
| script_json | TEXT | 否 | NULL | 视频脚本JSON(场景、文字、时长),当type=2时使用 |
| dishes_json | TEXT | 否 | NULL | 菜品清单JSON,当type=2时使用 |
| nutrition_json | TEXT | 否 | NULL | 营养数据JSON,当type=2时使用 |
| generation_method | VARCHAR(20) | 否 | 'ai' | 生成方式:ai(AI生成)/template(模板),当type=2时使用 |
| ai_provider | VARCHAR(50) | 否 | NULL | AI提供商:runway/heygen/d-id/jianyng等,当type=2时使用 |
| generation_cost | DECIMAL(10,4) | 否 | NULL | 生成成本(美元),当type=2时使用 |
| generation_time | INT | 否 | NULL | 生成耗时(秒),当type=2时使用 |
| download_count | INT | 否 | 0 | 下载次数(当type=2时使用,view_count用visit字段代替) |
| share_count | INT | 否 | 0 | 分享次数(当type=2时使用) |
已有字段说明(用于AI视频):
video_url- 视频地址(已有字段)status_task- 视频状态:0=已创建(对应generating),1=任务完成(对应completed),2=任务失败(对应failed)remark- 失败原因(可用remark字段代替error_message)update_time- 生成完成时间(可用update_time字段代替completed_at)visit- 观看次数(可用visit字段代替view_count)
索引:
- INDEX
idx_post_id(post_id) - INDEX
idx_check_in_record_id(check_in_record_id) - INDEX
idx_type_status_task(type,status_task)
业务说明:
- AI视频使用
type=2标识 status_task字段表示视频生成状态- 视频URL存储在
video_url字段
0.3 eb_user_integral_record(用户积分记录表 - 扩展字段)
表说明:使用现有 eb_user_integral_record 表,通过扩展字段支持更详细的积分来源记录。
扩展字段:
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| source_detail | VARCHAR(50) | 否 | NULL | 来源详情:check_in(打卡)/photo(照片)/share(分享)/streak(连续打卡)/exchange(兑换)/consult(咨询)/order(订单)/sign(签到)/system(系统) |
索引:
- INDEX
idx_source_detail(source_detail)
业务说明:
source_detail字段用于更详细地记录积分来源- 与
link_type字段配合使用,提供更精确的积分来源信息
1. 食谱计算器相关
1.1 v2_calculator_results(食谱计算器结果表)
表说明:存储用户使用食谱计算器计算后的营养方案结果。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| result_id | BIGINT | 是 | AUTO_INCREMENT | 计算结果ID(主键) |
| user_id | BIGINT | 是 | - | 用户ID |
| gender | VARCHAR(10) | 否 | NULL | 性别:male/female |
| age | INT | 否 | NULL | 年龄 |
| height | INT | 否 | NULL | 身高(cm) |
| weight | DECIMAL(5,2) | 否 | NULL | 体重(kg) |
| has_dialysis | TINYINT(1) | 否 | 0 | 是否透析:0=否,1=是 |
| dialysis_type | VARCHAR(20) | 否 | NULL | 透析类型:hemodialysis(血液透析)/peritoneal(腹膜透析) |
| dry_weight | DECIMAL(5,2) | 否 | NULL | 干体重(kg) |
| creatinine | DECIMAL(8,2) | 否 | NULL | 血肌酐(μmol/L) |
| egfr | DECIMAL(5,2) | 否 | NULL | eGFR值 |
| standard_weight | DECIMAL(5,2) | 否 | NULL | 标准体重(kg) |
| bmi | DECIMAL(4,1) | 否 | NULL | BMI值 |
| ckd_stage | VARCHAR(50) | 否 | NULL | CKD分期 |
| protein_intake | DECIMAL(5,1) | 否 | NULL | 蛋白质摄入量(g/天) |
| energy_intake | INT | 否 | NULL | 能量摄入量(kcal/天) |
| meal_plan_json | TEXT | 否 | NULL | 配餐方案JSON,包含早中晚三餐详情 |
| is_adopted | TINYINT(1) | 否 | 0 | 是否已采纳:0=未采纳,1=已采纳 |
| adopted_at | TIMESTAMP | 否 | NULL | 采纳时间 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
索引:
- PRIMARY KEY (
result_id) - INDEX
idx_user_id(user_id) - INDEX
idx_is_adopted(is_adopted) - INDEX
idx_created_at(created_at)
业务说明:
- 用户每次使用计算器都会生成一条记录
is_adopted=1时表示用户采纳了该方案,会创建对应的营养计划(v2_nutrition_plans)meal_plan_json格式示例:{ "breakfast": { "dishes": [{"name": "牛奶", "amount": 120, "unit": "ml"}], "total_protein": 18.8, "total_energy": 452 }, "lunch": {...}, "dinner": {...} }
2. 营养计划相关
2.1 v2_nutrition_plans(营养计划表)
表说明:存储用户采纳的营养计划,通常为7天周期。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| plan_id | BIGINT | 是 | AUTO_INCREMENT | 营养计划ID(主键) |
| user_id | BIGINT | 是 | - | 用户ID |
| result_id | BIGINT | 否 | NULL | 关联的计算结果ID |
| gender | VARCHAR(10) | 否 | NULL | 性别:male/female |
| age | INT | 否 | NULL | 年龄 |
| height | INT | 否 | NULL | 身高(cm) |
| weight | DECIMAL(5,2) | 否 | NULL | 体重(kg) |
| has_dialysis | TINYINT(1) | 否 | 0 | 是否透析:0=否,1=是 |
| dialysis_type | VARCHAR(20) | 否 | NULL | 透析类型 |
| creatinine | DECIMAL(8,2) | 否 | NULL | 血肌酐(μmol/L) |
| egfr | DECIMAL(5,2) | 否 | NULL | eGFR值 |
| standard_weight | DECIMAL(5,2) | 否 | NULL | 标准体重(kg) |
| bmi | DECIMAL(4,1) | 否 | NULL | BMI值 |
| ckd_stage | VARCHAR(50) | 否 | NULL | CKD分期 |
| protein_intake | DECIMAL(5,1) | 否 | NULL | 蛋白质摄入量(g/天) |
| energy_intake | INT | 否 | NULL | 能量摄入量(kcal/天) |
| meal_plan_json | TEXT | 否 | NULL | 配餐方案JSON |
| status | VARCHAR(20) | 否 | 'active' | 状态:active(进行中)/completed(已完成)/abandoned(已放弃) |
| start_date | DATE | 否 | NULL | 计划开始日期 |
| end_date | DATE | 否 | NULL | 计划结束日期(通常为start_date + 7天) |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
索引:
- PRIMARY KEY (
plan_id) - INDEX
idx_user_id(user_id) - INDEX
idx_status(status) - INDEX
idx_start_date(start_date)
业务说明:
- 用户采纳计算结果后创建营养计划
- 一个用户同时只能有一个
status='active'的计划 end_date通常为start_date + 7天
3. 饮食打卡相关
3.1 eb_user_sign(用户签到表 - 打卡功能)
表说明:使用现有 eb_user_sign 表,通过扩展字段支持饮食打卡功能。详细字段说明见 0.1 eb_user_sign(用户签到表 - 扩展字段用于打卡功能)。
业务说明:
- 打卡记录使用
type=3标识 - 同一用户同一天同一餐次只能打卡一次
- 支持AI智能识别食物
- 自动计算营养数据和达标率
- 生成营养分析报告
4. 积分系统相关
4.1 v2_user_points(用户积分表)
表说明:存储用户积分统计信息。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| user_id | BIGINT | 是 | - | 用户ID(主键) |
| total_points | INT | 否 | 0 | 累计总积分 |
| available_points | INT | 否 | 0 | 可用积分 |
| used_points | INT | 否 | 0 | 已使用积分 |
| total_check_ins | INT | 否 | 0 | 总打卡次数 |
| current_streak | INT | 否 | 0 | 当前连续打卡天数 |
| longest_streak | INT | 否 | 0 | 最长连续打卡天数 |
| last_check_in_date | DATE | 否 | NULL | 最后打卡日期 |
| free_consult_text_count | INT | 否 | 0 | 可用的图文咨询次数 |
| free_consult_voice_count | INT | 否 | 0 | 可用的语音/视频咨询次数 |
| ai_consult_unlimited_expire_at | TIMESTAMP | 否 | NULL | AI不限次咨询过期时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
索引:
- PRIMARY KEY (
user_id)
业务说明:
- 每个用户只有一条记录
total_points=available_points+used_pointscurrent_streak用于计算连续打卡奖励
5. AI营养师相关
5.1 v2_ai_conversations(AI营养师对话表)
表说明:存储用户与AI营养师的对话会话。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| conversation_id | BIGINT | 是 | AUTO_INCREMENT | 对话ID(主键) |
| user_id | BIGINT | 是 | - | 用户ID |
| title | VARCHAR(100) | 否 | NULL | 对话标题(自动生成或用户自定义) |
| status | VARCHAR(20) | 否 | 'active' | 状态:active(进行中)/archived(已归档)/deleted(已删除) |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
| last_message_at | TIMESTAMP | 否 | NULL | 最后消息时间 |
索引:
- PRIMARY KEY (
conversation_id) - INDEX
idx_user_id(user_id) - INDEX
idx_status(status) - INDEX
idx_last_message_at(last_message_at)
业务说明:
- 一个用户可以有多个对话会话
title通常由第一条消息自动生成
5.2 v2_ai_messages(AI营养师消息表)
表说明:存储对话中的每条消息。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| message_id | BIGINT | 是 | AUTO_INCREMENT | 消息ID(主键) |
| conversation_id | BIGINT | 是 | - | 对话ID |
| user_id | BIGINT | 是 | - | 用户ID |
| message_type | VARCHAR(20) | 是 | - | 消息类型:text/image/voice |
| content | TEXT | 否 | NULL | 消息内容(文本内容或语音转文字) |
| image_url | VARCHAR(500) | 否 | NULL | 图片URL(当type为image时) |
| voice_url | VARCHAR(500) | 否 | NULL | 语音URL(当type为voice时) |
| sender | VARCHAR(20) | 是 | - | 发送者:user(用户)/ai(AI营养师) |
| ai_response | TEXT | 否 | NULL | AI回复内容 |
| ai_response_status | VARCHAR(20) | 否 | 'pending' | AI回复状态:pending/success/failed |
| ai_response_time | TIMESTAMP | 否 | NULL | AI回复时间 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
索引:
- PRIMARY KEY (
message_id) - INDEX
idx_conversation_id(conversation_id) - INDEX
idx_user_id(user_id) - INDEX
idx_created_at(created_at)
业务说明:
- 用户发送消息时,
sender='user',ai_response_status='pending' - AI回复后,更新
ai_response、ai_response_status='success'、ai_response_time
6. 营养师咨询相关
6.1 v2_nutritionist_consultations(营养师咨询记录表)
表说明:存储用户与真人营养师的咨询记录。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| consultation_id | BIGINT | 是 | AUTO_INCREMENT | 咨询ID(主键) |
| user_id | BIGINT | 是 | - | 用户ID |
| consult_type | VARCHAR(20) | 是 | - | 咨询类型:text/voice/video |
| status | VARCHAR(20) | 是 | 'pending' | 状态:pending/in_progress/completed/cancelled |
| question_text | TEXT | 否 | NULL | 用户提问 |
| question_images_json | TEXT | 否 | NULL | 问题相关图片URL数组,JSON格式 |
| related_report_id | VARCHAR(50) | 否 | NULL | 关联的营养报告ID |
| related_check_in_id | INT | 否 | NULL | 关联的打卡记录ID(关联eb_user_sign.id,当type=3时) |
| nutritionist_id | BIGINT | 否 | NULL | 营养师ID |
| nutritionist_reply | TEXT | 否 | NULL | 营养师回复 |
| reply_images_json | TEXT | 否 | NULL | 回复相关图片,JSON格式 |
| follow_up_count | INT | 否 | 0 | 追问次数 |
| follow_up_questions_json | TEXT | 否 | NULL | 追问和回复记录,JSON格式 |
| call_start_time | TIMESTAMP | 否 | NULL | 通话开始时间 |
| call_end_time | TIMESTAMP | 否 | NULL | 通话结束时间 |
| call_duration | INT | 否 | NULL | 通话时长(秒) |
| call_recording_url | VARCHAR(500) | 否 | NULL | 通话录音URL(可选) |
| points_cost | INT | 否 | 0 | 消耗积分 |
| cash_cost | DECIMAL(10,2) | 否 | 0 | 现金支付(元) |
| user_rating | INT | 否 | NULL | 用户评分(1-5星) |
| user_feedback | TEXT | 否 | NULL | 用户反馈 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
| replied_at | TIMESTAMP | 否 | NULL | 营养师回复时间 |
索引:
- PRIMARY KEY (
consultation_id) - INDEX
idx_user_id(user_id) - INDEX
idx_nutritionist_id(nutritionist_id) - INDEX
idx_status(status) - INDEX
idx_created_at(created_at)
业务说明:
follow_up_count最多为3次follow_up_questions_json格式:[ { "question": "那我可以吃西瓜吗?", "reply": "西瓜属于中等钾含量水果,建议少量食用", "created_at": "2025-11-20 10:30:00" } ]
7. 食物百科相关
7.1 v2_foods(食物百科表)
表说明:存储食物百科数据,包含营养成分和适宜性信息。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| food_id | BIGINT | 是 | AUTO_INCREMENT | 食物ID(主键) |
| name | VARCHAR(100) | 是 | - | 食物名称 |
| alias | VARCHAR(200) | 否 | NULL | 别名(多个用逗号分隔) |
| category | VARCHAR(50) | 否 | NULL | 分类:grain(主食)/vegetable(蔬菜)/fruit(水果)/meat(肉类)/seafood(海鲜)/dairy(乳制品)/other(其他) |
| image | VARCHAR(500) | 否 | NULL | 食物图片URL |
| protein | DECIMAL(5,2) | 否 | NULL | 蛋白质(g) |
| fat | DECIMAL(5,2) | 否 | NULL | 脂肪(g) |
| carbohydrate | DECIMAL(5,2) | 否 | NULL | 碳水化合物(g) |
| energy | INT | 否 | NULL | 能量(kcal) |
| potassium | INT | 否 | NULL | 钾(mg) |
| phosphorus | INT | 否 | NULL | 磷(mg) |
| sodium | INT | 否 | NULL | 钠(mg) |
| calcium | INT | 否 | NULL | 钙(mg) |
| iron | DECIMAL(5,2) | 否 | NULL | 铁(mg) |
| vitamin_c | DECIMAL(5,2) | 否 | NULL | 维生素C(mg) |
| nutrients_json | TEXT | 否 | NULL | 其他营养成分,JSON格式 |
| suitability_level | VARCHAR(20) | 否 | NULL | 适宜性等级:suitable(适宜)/moderate(适量)/restricted(限制)/forbidden(禁止) |
| suitability_desc | TEXT | 否 | NULL | 适宜性说明 |
| caution_level | INT | 否 | 0 | 注意事项等级:0=无,1=低,2=中,3=高 |
| caution_desc | TEXT | 否 | NULL | 注意事项说明 |
| recommended_amount | VARCHAR(50) | 否 | NULL | 推荐用量,如:50-100g/天 |
| cooking_tips | TEXT | 否 | NULL | 烹饪建议 |
| status | VARCHAR(20) | 否 | 'active' | 状态:active/inactive |
| sort_order | INT | 否 | 0 | 排序 |
| view_count | INT | 否 | 0 | 查看次数 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
索引:
- PRIMARY KEY (
food_id) - INDEX
idx_name(name) - INDEX
idx_category(category) - INDEX
idx_suitability_level(suitability_level) - INDEX
idx_status(status)
业务说明:
- 营养成分数据基于《中国食物成分表》(第6版)
suitability_level用于快速筛选适宜食物
8. 营养知识相关
8.1 v2_knowledge(营养知识表)
表说明:存储营养知识文章、指南等内容。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| knowledge_id | BIGINT | 是 | AUTO_INCREMENT | 知识ID(主键) |
| title | VARCHAR(200) | 是 | - | 标题 |
| content | TEXT | 是 | - | 内容 |
| summary | VARCHAR(500) | 否 | NULL | 摘要 |
| cover_image | VARCHAR(500) | 否 | NULL | 封面图URL |
| images_json | TEXT | 否 | NULL | 内容图片数组,JSON格式 |
| type | VARCHAR(50) | 否 | NULL | 类型:nutrients/guide/article/recipe |
| category | VARCHAR(50) | 否 | NULL | 分类 |
| tags_json | TEXT | 否 | NULL | 标签数组,JSON格式 |
| nutrient_name | VARCHAR(50) | 否 | NULL | 关联的营养素名称(当type为nutrients时) |
| view_count | INT | 否 | 0 | 查看次数 |
| like_count | INT | 否 | 0 | 点赞次数 |
| collect_count | INT | 否 | 0 | 收藏次数 |
| share_count | INT | 否 | 0 | 分享次数 |
| status | VARCHAR(20) | 否 | 'published' | 状态:draft/published/deleted |
| is_recommend | TINYINT(1) | 否 | 0 | 是否推荐:0=否,1=是 |
| sort_order | INT | 否 | 0 | 排序 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
| published_at | TIMESTAMP | 否 | NULL | 发布时间 |
索引:
- PRIMARY KEY (
knowledge_id) - INDEX
idx_type(type) - INDEX
idx_category(category) - INDEX
idx_nutrient_name(nutrient_name) - INDEX
idx_status(status) - INDEX
idx_is_recommend(is_recommend) - INDEX
idx_created_at(created_at)
9. 食谱相关
9.1 v2_recipes(食谱表)
表说明:存储食谱信息,包括官方食谱和用户自定义食谱。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| recipe_id | BIGINT | 是 | AUTO_INCREMENT | 食谱ID(主键) |
| user_id | BIGINT | 否 | NULL | 用户ID(用户自定义食谱时) |
| name | VARCHAR(100) | 是 | - | 食谱名称 |
| description | TEXT | 否 | NULL | 食谱描述 |
| cover_image | VARCHAR(500) | 否 | NULL | 封面图URL |
| images_json | TEXT | 否 | NULL | 食谱图片数组,JSON格式 |
| meal_type | VARCHAR(20) | 否 | NULL | 餐次:breakfast/lunch/dinner/snack |
| category | VARCHAR(50) | 否 | NULL | 分类 |
| tags_json | TEXT | 否 | NULL | 标签数组,JSON格式 |
| ingredients_json | TEXT | 否 | NULL | 食材清单,JSON格式 |
| steps_json | TEXT | 否 | NULL | 制作步骤,JSON格式 |
| total_protein | DECIMAL(5,1) | 否 | NULL | 总蛋白质(g) |
| total_energy | INT | 否 | NULL | 总能量(kcal) |
| total_potassium | INT | 否 | NULL | 总钾(mg) |
| total_phosphorus | INT | 否 | NULL | 总磷(mg) |
| total_sodium | INT | 否 | NULL | 总钠(mg) |
| nutrition_json | TEXT | 否 | NULL | 其他营养成分,JSON格式 |
| suitable_stages_json | TEXT | 否 | NULL | 适宜的CKD分期,JSON格式 |
| suitable_dialysis | TINYINT(1) | 否 | NULL | 是否适合透析患者:0=否,1=是 |
| view_count | INT | 否 | 0 | 查看次数 |
| like_count | INT | 否 | 0 | 点赞次数 |
| collect_count | INT | 否 | 0 | 收藏次数 |
| cook_count | INT | 否 | 0 | 制作次数 |
| status | VARCHAR(20) | 否 | 'published' | 状态:draft/published/deleted |
| is_recommend | TINYINT(1) | 否 | 0 | 是否推荐:0=否,1=是 |
| is_official | TINYINT(1) | 否 | 0 | 是否官方食谱:0=否,1=是 |
| sort_order | INT | 否 | 0 | 排序 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
索引:
- PRIMARY KEY (
recipe_id) - INDEX
idx_user_id(user_id) - INDEX
idx_meal_type(meal_type) - INDEX
idx_category(category) - INDEX
idx_status(status) - INDEX
idx_is_recommend(is_recommend) - INDEX
idx_created_at(created_at)
业务说明:
ingredients_json格式:[ {"name": "鸡蛋", "amount": 2, "unit": "个"}, {"name": "面条", "amount": 100, "unit": "g"} ]steps_json格式:[ {"step": 1, "description": "将鸡蛋打散", "image": "url1"}, {"step": 2, "description": "煮面条", "image": "url2"} ]
10. 打卡社区相关
10.1 v2_community_posts(社区内容表)
表说明:存储用户发布的社区内容(打卡分享)。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| post_id | BIGINT | 是 | AUTO_INCREMENT | 内容ID(主键) |
| user_id | BIGINT | 是 | - | 用户ID |
| check_in_record_id | INT | 否 | NULL | 关联的打卡记录ID(eb_user_sign.id,当type=3时) |
| title | VARCHAR(100) | 是 | - | 标题 |
| content | TEXT | 否 | NULL | 内容 |
| cover_image | VARCHAR(255) | 否 | NULL | 封面图URL |
| images_json | TEXT | 否 | NULL | 图片数组,JSON格式 |
| nutrition_data_json | TEXT | 否 | NULL | 营养数据快照,JSON格式 |
| tags_json | TEXT | 否 | NULL | 标签数组,JSON格式 |
| like_count | INT | 否 | 0 | 点赞数 |
| comment_count | INT | 否 | 0 | 评论数 |
| collect_count | INT | 否 | 0 | 收藏数 |
| share_count | INT | 否 | 0 | 分享数 |
| view_count | INT | 否 | 0 | 查看数 |
| quick_checkin_count | INT | 否 | 0 | 被一键打卡次数 |
| ai_video_count | INT | 否 | 0 | 生成AI视频次数(关联eb_article表,type=2时) |
| recommend_score | DECIMAL(10,2) | 否 | 0 | 推荐分数 |
| hot_score | DECIMAL(10,2) | 否 | 0 | 热门分数 |
| status | VARCHAR(20) | 否 | 'published' | 状态:draft/published/deleted/banned |
| privacy | VARCHAR(20) | 否 | 'public' | 隐私设置:public/followers_only/private |
| audit_status | VARCHAR(20) | 否 | 'pending' | 审核状态:pending/approved/rejected |
| audit_time | TIMESTAMP | 否 | NULL | 审核时间 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 更新时间 |
索引:
- PRIMARY KEY (
post_id) - INDEX
idx_user_id(user_id) - INDEX
idx_status(status) - INDEX
idx_created_at(created_at) - INDEX
idx_recommend_score(recommend_score) - INDEX
idx_hot_score(hot_score)
10.2 v2_community_interactions(社区互动表)
表说明:存储用户对内容的互动记录(点赞、收藏、分享、查看)。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| interaction_id | BIGINT | 是 | AUTO_INCREMENT | 互动ID(主键) |
| user_id | BIGINT | 是 | - | 用户ID |
| post_id | BIGINT | 是 | - | 内容ID |
| interaction_type | VARCHAR(20) | 是 | - | 互动类型:like/collect/share/view |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
索引:
- PRIMARY KEY (
interaction_id) - UNIQUE KEY
uk_user_post_type(user_id,post_id,interaction_type) - INDEX
idx_post_id(post_id) - INDEX
idx_user_id(user_id)
业务说明:
- 一个用户对一条内容只能有一种类型的互动(唯一约束)
view类型可以重复记录(用于统计)
10.3 v2_community_comments(社区评论表)
表说明:存储社区内容的评论。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| comment_id | BIGINT | 是 | AUTO_INCREMENT | 评论ID(主键) |
| post_id | BIGINT | 是 | - | 内容ID |
| user_id | BIGINT | 是 | - | 用户ID |
| content | TEXT | 是 | - | 评论内容 |
| parent_comment_id | BIGINT | 否 | NULL | 父评论ID,NULL为一级评论 |
| reply_to_user_id | BIGINT | 否 | NULL | @的用户ID |
| like_count | INT | 否 | 0 | 点赞数 |
| status | VARCHAR(20) | 否 | 'published' | 状态:published/deleted/banned |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
索引:
- PRIMARY KEY (
comment_id) - INDEX
idx_post_id(post_id) - INDEX
idx_user_id(user_id) - INDEX
idx_parent_comment_id(parent_comment_id)
业务说明:
- 支持二级评论(回复)
parent_comment_id为 NULL 表示一级评论
10.4 v2_community_follows(关注关系表)
表说明:存储用户之间的关注关系。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| follow_id | BIGINT | 是 | AUTO_INCREMENT | 关注ID(主键) |
| follower_id | BIGINT | 是 | - | 关注者ID |
| followee_id | BIGINT | 是 | - | 被关注者ID |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
索引:
- PRIMARY KEY (
follow_id) - UNIQUE KEY
uk_follower_followee(follower_id,followee_id) - INDEX
idx_follower_id(follower_id) - INDEX
idx_followee_id(followee_id)
业务说明:
- 一个用户不能重复关注同一个用户(唯一约束)
12. 一键打卡相关
12.1 v2_quick_checkin_records(一键打卡记录表)
表说明:存储用户从社区内容一键打卡的记录。
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| quick_checkin_id | BIGINT | 是 | AUTO_INCREMENT | 一键打卡ID(主键) |
| user_id | BIGINT | 是 | - | 借鉴者ID |
| source_post_id | BIGINT | 是 | - | 借鉴的社区内容ID |
| source_user_id | BIGINT | 是 | - | 原创者ID |
| dishes_json | TEXT | 否 | NULL | 借鉴的菜品清单(可能有修改),JSON格式 |
| nutrition_json | TEXT | 否 | NULL | 营养数据,JSON格式 |
| is_modified | TINYINT(1) | 否 | 0 | 是否修改了菜品清单:0=否,1=是 |
| checkin_date | DATE | 是 | - | 打卡日期 |
| meal_type | VARCHAR(20) | 是 | - | 餐次:breakfast/lunch/dinner |
| check_in_record_id | INT | 否 | NULL | 生成的打卡记录ID(关联eb_user_sign.id,当type=3时) |
| article_id | INT | 否 | NULL | 生成的AI视频文章ID(关联eb_article.id,当type=2时) |
| video_generated | TINYINT(1) | 否 | 0 | 是否生成了AI视频:0=否,1=是 |
| points_earned | INT | 否 | 0 | 借鉴者获得的积分 |
| points_to_author | INT | 否 | 0 | 原创者获得的积分 |
| created_at | TIMESTAMP | 否 | CURRENT_TIMESTAMP | 创建时间 |
| completed_at | TIMESTAMP | 否 | NULL | 打卡完成时间 |
索引:
- PRIMARY KEY (
quick_checkin_id) - INDEX
idx_user_id(user_id) - INDEX
idx_source_post_id(source_post_id) - INDEX
idx_source_user_id(source_user_id) - INDEX
idx_checkin_date(checkin_date) - INDEX
idx_article_id(article_id)
业务说明:
- 用户从社区内容一键打卡时创建记录
- 打卡完成后更新
check_in_record_id和completed_at - 原创者获得积分奖励
- AI视频存储在
eb_article表中(type=2),通过article_id关联
11. AI视频相关
11.1 eb_article(文章内容表 - AI视频功能)
表说明:使用现有 eb_article 表,通过扩展字段支持AI视频功能。详细字段说明见 0.2 eb_article(文章内容表 - 扩展字段用于AI视频功能)。
业务说明:
- AI视频使用
type=2标识 status_task字段表示视频生成状态:0=已创建,1=任务完成,2=任务失败- 视频URL存储在
video_url字段 - 视频相关信息存储在扩展字段中
索引说明
索引命名规范
- 主键:
PRIMARY KEY - 唯一索引:
uk_前缀 - 普通索引:
idx_前缀
常用查询场景索引
- 用户相关查询:所有表都有
idx_user_id - 时间相关查询:创建时间、更新时间索引
- 状态查询:
status字段索引 - 关联查询:外键字段索引
性能优化建议
- 定期分析慢查询,优化索引
- 对于大表(如打卡记录),考虑分区
- JSON字段如需查询,考虑使用虚拟列+索引
- 定期清理归档数据
附录
JSON字段格式说明
meal_plan_json(配餐方案)
{
"breakfast": {
"dishes": [
{"name": "牛奶", "amount": 120, "unit": "ml"},
{"name": "鸡蛋", "amount": 1, "unit": "个"}
],
"total_protein": 18.8,
"total_energy": 452
},
"lunch": {...},
"dinner": {...}
}
ai_recognized_foods_json(AI识别食物)
[
{
"name": "牛奶",
"weight": 120,
"unit": "ml",
"confidence": 0.95
}
]
ai_comments_json(AI点评)
{
"strengths": ["蛋白质达标", "能量充足"],
"suggestions": ["可以增加蔬菜摄入"],
"next_meal_advice": "午餐建议选择低磷食物"
}
文档结束