05_数据库表结构设计
1. 文档目标
本文档定义系统 B 的 MySQL 核心表结构。字段类型为建议值,实际开发时可根据 ORM 选型调整。
2. 命名原则
- 表名使用复数:
users, projects
- 主键统一为
id BIGINT 或 UUID,根据实现决定
- 时间字段统一:
created_at, updated_at, deleted_at
- 状态字段统一使用字符串枚举
- 金额使用整数分:
amount_cent
- JSON 配置使用
JSON 类型
3. users 用户表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
用户 ID |
| nickname |
VARCHAR(100) |
昵称 |
| phone |
VARCHAR(30) |
手机号 |
| email |
VARCHAR(100) |
邮箱 |
| wechat_openid |
VARCHAR(100) |
微信 openid |
| avatar_asset_id |
BIGINT |
头像资源 |
| status |
VARCHAR(30) |
active/disabled |
| created_at |
DATETIME |
创建时间 |
| updated_at |
DATETIME |
更新时间 |
索引:
- UNIQUE(phone)
- UNIQUE(wechat_openid)
4. admin_users 后台用户表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
管理员 ID |
| username |
VARCHAR(100) |
用户名 |
| password_hash |
VARCHAR(255) |
密码哈希 |
| role_id |
BIGINT |
角色 ID |
| status |
VARCHAR(30) |
状态 |
| created_at |
DATETIME |
创建时间 |
5. roles 角色表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
角色 ID |
| name |
VARCHAR(100) |
角色名称 |
| code |
VARCHAR(100) |
角色编码 |
| permissions |
JSON |
权限列表 |
| status |
VARCHAR(30) |
状态 |
6. projects 项目表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
项目 ID |
| user_id |
BIGINT |
用户 ID |
| title |
VARCHAR(200) |
项目标题 |
| life_theme_id |
BIGINT |
人生主题 |
| package_id |
BIGINT |
套餐 |
| style_id |
BIGINT |
视觉风格 |
| output_type |
VARCHAR(30) |
image/video/both |
| status |
VARCHAR(50) |
项目状态 |
| payment_status |
VARCHAR(50) |
支付状态 |
| total_duration |
INT |
视频秒数 |
| image_count |
INT |
图片数量 |
| cover_asset_id |
BIGINT |
封面 |
| video_asset_id |
BIGINT |
视频 |
| allow_public_case |
BOOLEAN |
是否允许公开案例 |
| custom_info |
JSON |
用户定制信息 |
| created_at |
DATETIME |
创建时间 |
| updated_at |
DATETIME |
更新时间 |
| completed_at |
DATETIME |
完成时间 |
索引:
- INDEX(user_id, status)
- INDEX(created_at)
- INDEX(life_theme_id)
7. orders 订单表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
订单 ID |
| user_id |
BIGINT |
用户 ID |
| project_id |
BIGINT |
项目 ID |
| package_id |
BIGINT |
套餐 ID |
| amount_cent |
INT |
金额,单位分 |
| pay_status |
VARCHAR(30) |
pending/paid/failed/cancelled |
| pay_method |
VARCHAR(30) |
wechat/alipay/balance/manual |
| transaction_id |
VARCHAR(100) |
第三方交易号 |
| refund_status |
VARCHAR(30) |
none/refunding/refunded |
| created_at |
DATETIME |
创建时间 |
| paid_at |
DATETIME |
支付时间 |
8. packages 套餐表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
套餐 ID |
| code |
VARCHAR(100) |
编码 |
| name |
VARCHAR(100) |
名称 |
| price_cent |
INT |
价格 |
| world_min |
INT |
最少世界数 |
| world_max |
INT |
最多世界数 |
| scene_min |
INT |
最少场景数 |
| scene_max |
INT |
最多场景数 |
| image_min |
INT |
最少图片数 |
| image_max |
INT |
最多图片数 |
| video_duration_min |
INT |
最短视频秒数 |
| video_duration_max |
INT |
最长视频秒数 |
| revision_count |
INT |
修改次数 |
| allow_video |
BOOLEAN |
是否视频 |
| allow_voice |
BOOLEAN |
是否旁白 |
| allow_advanced_video |
BOOLEAN |
是否高级动态 |
| manual_review_required |
BOOLEAN |
是否人工审核 |
| config_json |
JSON |
扩展配置 |
| status |
VARCHAR(30) |
状态 |
9. life_themes 人生主题表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
主题 ID |
| code |
VARCHAR(100) |
编码 |
| name |
VARCHAR(100) |
名称 |
| description |
TEXT |
说明 |
| cover_asset_id |
BIGINT |
封面 |
| person_schema |
JSON |
人物结构规则 |
| default_copy_moods |
JSON |
默认文案风格 |
| status |
VARCHAR(30) |
状态 |
| sort_order |
INT |
排序 |
person_schema 示例:
10. style_templates 风格模板表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
风格 ID |
| code |
VARCHAR(100) |
编码 |
| name |
VARCHAR(100) |
名称 |
| description |
TEXT |
说明 |
| cover_asset_id |
BIGINT |
封面 |
| prompt_style |
TEXT |
风格 Prompt |
| negative_rules |
TEXT |
禁止项 |
| supported_theme_ids |
JSON |
支持主题 |
| status |
VARCHAR(30) |
状态 |
11. world_templates 世界观模板表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
世界 ID |
| code |
VARCHAR(100) |
编码 |
| name |
VARCHAR(100) |
名称 |
| category |
VARCHAR(100) |
分类 |
| description |
TEXT |
说明 |
| cover_asset_id |
BIGINT |
封面 |
| prompt_base |
TEXT |
世界基础 Prompt |
| costume_rules |
TEXT |
服装规则 |
| scene_rules |
TEXT |
场景规则 |
| style_rules |
TEXT |
风格规则 |
| negative_rules |
TEXT |
禁止项 |
| supported_theme_ids |
JSON |
支持主题 |
| supported_style_ids |
JSON |
支持风格 |
| is_premium |
BOOLEAN |
高级模板 |
| status |
VARCHAR(30) |
状态 |
| sort_order |
INT |
排序 |
12. scene_templates 场景模板表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
场景 ID |
| world_id |
BIGINT |
所属世界 |
| code |
VARCHAR(100) |
编码 |
| name |
VARCHAR(100) |
名称 |
| description |
TEXT |
说明 |
| cover_asset_id |
BIGINT |
封面 |
| scene_prompt |
TEXT |
场景 Prompt |
| composition_rules |
TEXT |
构图规则 |
| lighting_rules |
TEXT |
光影规则 |
| effect_type |
VARCHAR(100) |
特效类型 |
| recommended_shot_count |
INT |
推荐镜头数 |
| is_premium |
BOOLEAN |
高级场景 |
| status |
VARCHAR(30) |
状态 |
| sort_order |
INT |
排序 |
13. shot_templates 镜头模板表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
镜头模板 ID |
| scene_id |
BIGINT |
所属场景 |
| code |
VARCHAR(100) |
编码 |
| name |
VARCHAR(100) |
名称 |
| shot_type |
VARCHAR(100) |
镜头类型 |
| camera_angle |
VARCHAR(100) |
视角 |
| composition |
TEXT |
构图 |
| prompt_rule |
TEXT |
Prompt 规则 |
| duration |
INT |
默认秒数 |
| effect_type |
VARCHAR(100) |
运镜/特效 |
| status |
VARCHAR(30) |
状态 |
| sort_order |
INT |
排序 |
14. project_worlds 项目世界关系表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
ID |
| project_id |
BIGINT |
项目 ID |
| world_id |
BIGINT |
世界 ID |
| sort_order |
INT |
顺序 |
15. project_scenes 项目场景关系表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
ID |
| project_id |
BIGINT |
项目 ID |
| world_id |
BIGINT |
世界 ID |
| scene_id |
BIGINT |
场景 ID |
| sort_order |
INT |
顺序 |
16. person_profiles 人物档案表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
人物档案 ID |
| project_id |
BIGINT |
项目 ID |
| role |
VARCHAR(50) |
person_a/person_b/child 等 |
| name |
VARCHAR(100) |
名称 |
| gender_label |
VARCHAR(50) |
性别标签,可选 |
| age_group |
VARCHAR(50) |
年龄段 |
| appearance_summary |
TEXT |
外貌摘要 |
| reference_asset_ids |
JSON |
参考照片 |
| anchor_asset_id |
BIGINT |
锚点图 |
| quality_score |
DECIMAL(5,2) |
质量分 |
| status |
VARCHAR(30) |
状态 |
| created_at |
DATETIME |
创建时间 |
V3 真人动态视频增强字段:
| 字段 |
类型 |
说明 |
| identity_lock_status |
VARCHAR(50) |
unlocked/generating_anchor/waiting_user_confirm/locked/rejected |
| face_consistency_score |
DECIMAL(5,2) |
本人相似度评分 |
| primary_reference_asset_id |
BIGINT |
主参考照片 |
| approved_anchor_asset_id |
BIGINT |
用户确认的身份锚点 |
| age_preserve_rule |
VARCHAR(100) |
年龄保持规则:strict/soft/allow_younger 等 |
| beautify_level |
VARCHAR(50) |
美化强度:none/light/medium/high |
| style_transform_level |
VARCHAR(50) |
风格转换强度:realistic/semi_real/comic |
| privacy_level |
VARCHAR(50) |
隐私等级:normal/sensitive/minor |
17. assets 素材表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
素材 ID |
| user_id |
BIGINT |
用户 ID |
| project_id |
BIGINT |
项目 ID |
| asset_type |
VARCHAR(50) |
类型 |
| file_path |
VARCHAR(500) |
存储路径 |
| file_url |
VARCHAR(500) |
访问 URL,可为空 |
| mime_type |
VARCHAR(100) |
MIME |
| width |
INT |
宽 |
| height |
INT |
高 |
| duration |
INT |
音视频秒数 |
| size |
BIGINT |
文件大小 |
| hash |
VARCHAR(100) |
文件哈希 |
| visibility |
VARCHAR(30) |
private/public/case |
| status |
VARCHAR(30) |
状态 |
| created_at |
DATETIME |
创建时间 |
asset_type:
18. shot_plans 镜头计划表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
镜头计划 ID |
| project_id |
BIGINT |
项目 ID |
| world_id |
BIGINT |
世界 ID |
| scene_id |
BIGINT |
场景 ID |
| shot_template_id |
BIGINT |
镜头模板 ID |
| title |
VARCHAR(200) |
标题 |
| description |
TEXT |
画面描述 |
| prompt_text |
TEXT |
正向 Prompt |
| negative_prompt |
TEXT |
负向 Prompt |
| duration |
INT |
秒数 |
| output_asset_id |
BIGINT |
生成图 |
| sort_order |
INT |
顺序 |
| status |
VARCHAR(30) |
状态 |
19. render_tasks 生成任务表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
任务 ID |
| project_id |
BIGINT |
项目 ID |
| task_type |
VARCHAR(100) |
任务类型 |
| provider_id |
BIGINT |
Provider |
| status |
VARCHAR(30) |
状态 |
| input_json |
JSON |
输入 |
| input_hash |
VARCHAR(100) |
幂等哈希 |
| output_asset_id |
BIGINT |
输出素材 |
| provider_request_id |
VARCHAR(200) |
三方请求 ID |
| retry_count |
INT |
重试次数 |
| max_retry |
INT |
最大重试 |
| cost_estimate_cent |
INT |
预估成本 |
| cost_actual_cent |
INT |
实际成本 |
| error_code |
VARCHAR(100) |
错误码 |
| error_message |
TEXT |
错误信息 |
| created_at |
DATETIME |
创建时间 |
| started_at |
DATETIME |
开始时间 |
| finished_at |
DATETIME |
完成时间 |
索引:
- UNIQUE(project_id, task_type, input_hash)
- INDEX(status, created_at)
20. provider_configs Provider 配置表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
Provider ID |
| provider_type |
VARCHAR(50) |
text/image/video/voice/moderation |
| provider_name |
VARCHAR(100) |
名称 |
| model_name |
VARCHAR(100) |
模型名 |
| api_base |
VARCHAR(500) |
API Base |
| api_key_ref |
VARCHAR(100) |
密钥引用,不直接存明文 |
| priority |
INT |
优先级 |
| quality_level |
VARCHAR(50) |
quality/speed/cost |
| rate_limit_json |
JSON |
限流配置 |
| cost_rule_json |
JSON |
成本规则 |
| fallback_provider_id |
BIGINT |
备用 Provider |
| status |
VARCHAR(30) |
状态 |
21. provider_logs Provider 日志表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
日志 ID |
| provider_id |
BIGINT |
Provider |
| project_id |
BIGINT |
项目 |
| task_id |
BIGINT |
任务 |
| request_payload |
JSON |
请求,可脱敏 |
| response_payload |
JSON |
响应,可脱敏 |
| status |
VARCHAR(30) |
状态 |
| cost_cent |
INT |
成本 |
| latency_ms |
INT |
耗时 |
| created_at |
DATETIME |
创建时间 |
22. revision_requests 修改申请表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
修改 ID |
| project_id |
BIGINT |
项目 ID |
| user_id |
BIGINT |
用户 ID |
| revision_type |
VARCHAR(30) |
small/medium/major |
| request_text |
TEXT |
修改内容 |
| status |
VARCHAR(30) |
状态 |
| remaining_count_before |
INT |
修改前剩余次数 |
| handled_by |
BIGINT |
处理人 |
| created_at |
DATETIME |
创建时间 |
| updated_at |
DATETIME |
更新时间 |
23. authorizations 授权记录表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
授权 ID |
| user_id |
BIGINT |
用户 ID |
| project_id |
BIGINT |
项目 ID |
| authorization_type |
VARCHAR(50) |
类型 |
| content |
TEXT |
授权文本 |
| ip |
VARCHAR(100) |
IP |
| user_agent |
TEXT |
UA |
| confirmed_at |
DATETIME |
确认时间 |
类型:
24. case_showcases 案例表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
案例 ID |
| project_id |
BIGINT |
来源项目 |
| title |
VARCHAR(200) |
标题 |
| cover_asset_id |
BIGINT |
封面 |
| video_asset_id |
BIGINT |
视频 |
| theme_id |
BIGINT |
主题 |
| style_id |
BIGINT |
风格 |
| world_ids |
JSON |
世界列表 |
| sort_order |
INT |
排序 |
| is_featured |
BOOLEAN |
首页推荐 |
| status |
VARCHAR(30) |
状态 |
| authorization_id |
BIGINT |
授权记录 |
25. music_assets 音乐素材表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
音乐 ID |
| name |
VARCHAR(200) |
名称 |
| mood |
VARCHAR(100) |
情绪 |
| asset_id |
BIGINT |
音频资源 |
| duration |
INT |
秒数 |
| license_type |
VARCHAR(100) |
授权类型 |
| source |
VARCHAR(200) |
来源 |
| usage_scope |
TEXT |
使用范围 |
| status |
VARCHAR(30) |
状态 |
26. system_configs 系统配置表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
配置 ID |
| config_key |
VARCHAR(100) |
Key |
| config_value |
JSON |
Value |
| description |
TEXT |
说明 |
| updated_at |
DATETIME |
更新时间 |
27. audit_logs 操作日志表
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
日志 ID |
| actor_type |
VARCHAR(30) |
user/admin/system |
| actor_id |
BIGINT |
操作人 |
| action |
VARCHAR(100) |
动作 |
| target_type |
VARCHAR(100) |
目标类型 |
| target_id |
BIGINT |
目标 ID |
| detail_json |
JSON |
详情 |
| ip |
VARCHAR(100) |
IP |
| created_at |
DATETIME |
创建时间 |
28. V3 identity_anchors 身份锚点表
用于保存真人身份锚点,确保后续图片和视频尽量像本人。
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
锚点 ID |
| project_id |
BIGINT |
项目 ID |
| person_id |
BIGINT |
人物档案 ID |
| anchor_asset_id |
BIGINT |
锚点素材 |
| anchor_type |
VARCHAR(80) |
real_photo_anchor/semi_realistic_anchor/korean_comic_anchor/ancient_costume_anchor/future_style_anchor |
| quality_score |
DECIMAL(5,2) |
锚点质量分 |
| face_consistency_score |
DECIMAL(5,2) |
与本人相似度 |
| approved_by_user |
BOOLEAN |
用户是否确认 |
| approved_by_admin |
BOOLEAN |
后台是否确认 |
| status |
VARCHAR(50) |
generating/waiting_confirm/approved/rejected |
| created_at |
DATETIME |
创建时间 |
| updated_at |
DATETIME |
更新时间 |
29. V3 motion_templates 动作模板表
用于控制动态写真和真人视频片段的动作范围。
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
动作模板 ID |
| name |
VARCHAR(100) |
动作名称 |
| motion_type |
VARCHAR(100) |
smile/blink/turn_head/walk_forward/hold_hands 等 |
| description |
TEXT |
说明 |
| supported_themes |
JSON |
支持人生主题 |
| supported_worlds |
JSON |
支持世界模板 |
| supported_styles |
JSON |
支持视觉风格 |
| prompt_rule |
TEXT |
动作 Prompt 规则 |
| duration |
INT |
默认片段秒数 |
| difficulty_level |
VARCHAR(50) |
easy/medium/hard |
| cost_level |
VARCHAR(50) |
low/medium/high |
| status |
VARCHAR(30) |
状态 |
| sort_order |
INT |
排序 |
推荐动作:
30. V3 video_clips 视频片段表
每个 AI 动态视频片段单独存储,便于重试、替换、质检和成本追踪。
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
视频片段 ID |
| project_id |
BIGINT |
项目 ID |
| scene_id |
BIGINT |
场景 ID |
| shot_id |
BIGINT |
镜头 ID |
| person_ids |
JSON |
涉及人物 ID |
| provider_id |
BIGINT |
Provider 配置 ID |
| input_asset_id |
BIGINT |
输入关键帧 / 参考图 |
| output_asset_id |
BIGINT |
输出视频素材 |
| prompt_text |
TEXT |
视频 Prompt |
| duration |
INT |
秒数 |
| resolution |
VARCHAR(50) |
720p/1080p |
| motion_type |
VARCHAR(100) |
动作类型 |
| lipsync_enabled |
BOOLEAN |
是否启用口型 |
| status |
VARCHAR(50) |
pending/running/generated/failed/manual_required |
| retry_count |
INT |
重试次数 |
| cost_actual |
DECIMAL(12,4) |
实际成本 |
| quality_score |
DECIMAL(5,2) |
质检分 |
| quality_issues |
JSON |
质检问题 |
| created_at |
DATETIME |
创建时间 |
| updated_at |
DATETIME |
更新时间 |
31. V3 lipsync_tasks 口型任务表
口型任务可选,不应阻塞基础交付;失败时可回退旁白字幕版本。
| 字段 |
类型 |
说明 |
| id |
BIGINT PK |
任务 ID |
| project_id |
BIGINT |
项目 ID |
| video_clip_id |
BIGINT |
视频片段 ID |
| audio_asset_id |
BIGINT |
输入音频 |
| output_asset_id |
BIGINT |
口型后视频 |
| provider_id |
BIGINT |
LipSync Provider |
| status |
VARCHAR(50) |
pending/running/success/failed/manual_required |
| cost_actual |
DECIMAL(12,4) |
实际成本 |
| retry_count |
INT |
重试次数 |
| error_code |
VARCHAR(100) |
错误码 |
| error_message |
TEXT |
错误信息 |
| created_at |
DATETIME |
创建时间 |
| updated_at |
DATETIME |
更新时间 |