# 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 | 更新时间 |