Files
ai/docs/system_b/05_数据库表结构设计.md
T
2026-06-15 17:45:28 +08:00

578 lines
17 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 示例:
```json
{
"type": "couple",
"roles": ["person_a", "person_b"],
"min_photos_each": 3,
"max_photos_each": 8,
"minor_sensitive": false
}
```
## 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
```text
upload_photo
preview_image
final_image
audio
subtitle
video
cover
case_asset
music
```
## 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 | 确认时间 |
类型:
```text
photo_usage
public_case
minor_guardian
privacy_policy
terms
```
## 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 | 排序 |
推荐动作:
```text
smile
blink
turn_head
walk_forward
hold_hands
look_at_each_other
bow_ceremony
lift_veil
hug
wave
stand_still_cinematic
slow_camera_push
```
## 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 | 更新时间 |