数据库设计.md 17 KB

任务模块数据库设计

1. 数据库表概览

任务模块包含以下核心数据表:

  1. task_categories - 任务分类表
  2. task_tasks - 任务定义表
  3. task_conditions - 任务条件表
  4. task_achievement_conditions - 任务达成条件表
  5. task_user_tasks - 用户任务关联表
  6. task_user_progress - 用户任务进度表
  7. task_completion_logs - 任务完成日志表
  8. task_reward_logs - 任务奖励发放日志表
  9. task_reset_logs - 任务重置日志表

2. 表结构详细设计

2.1 任务分类表 (task_categories)

存储任务的分类信息,用于对任务进行分组和管理。

字段名 类型 允许空 默认值 说明
id int 自增 主键
name varchar(100) - 分类名称
code varchar(50) - 分类编码(唯一)
description varchar(255) NULL 分类描述
sort_order int 0 排序顺序
created_at timestamp NULL 创建时间
updated_at timestamp NULL 更新时间

索引:

  • PRIMARY KEY (id)
  • UNIQUE KEY idx_code (code)

2.2 任务定义表 (task_tasks)

存储任务的基本定义信息,包括任务名称、描述、奖励等。目标相关字段已拆分到任务达成条件表。

字段名 类型 允许空 默认值 说明
id int 自增 主键
category_id int - 任务分类ID,外键关联task_categories表
name varchar(100) - 任务名称
description varchar(500) NULL 任务描述
type varchar(20) - 任务类型(daily, weekly, achievement, event, tutorial, team)
rewards json - 奖励内容(JSON格式)
prerequisite_tasks json NULL 前置任务ID(JSON格式)
level_required int 0 所需等级
time_limit int NULL 时间限制(秒,NULL表示无限制)
reset_type varchar(20) 'none' 重置类型(none, daily, weekly, monthly)
is_active tinyint 1 是否激活(0:否, 1:是)
start_time timestamp NULL 开始时间(NULL表示立即开始)
end_time timestamp NULL 结束时间(NULL表示永不结束)
created_at timestamp NULL 创建时间
updated_at timestamp NULL 更新时间

索引:

  • PRIMARY KEY (id)
  • KEY idx_category (category_id)
  • KEY idx_type (type)
  • KEY idx_active_time (is_active, start_time, end_time)

2.3 用户任务关联表 (task_user_tasks)

存储用户与任务的关联信息,包括任务状态、进度、完成时间等。

字段名 类型 允许空 默认值 说明
id int 自增 主键
user_id int - 用户ID
task_id int - 任务ID,外键关联task_tasks表
status tinyint 0 状态(0:未接取, 1:进行中, 2:已完成, 3:已领取奖励, 4:已失败, 5:已过期)
progress int 0 当前进度
completed_at timestamp NULL 完成时间
rewarded_at timestamp NULL 奖励发放时间
expire_at timestamp NULL 过期时间
created_at timestamp NULL 创建时间
updated_at timestamp NULL 更新时间

索引:

  • PRIMARY KEY (id)
  • UNIQUE KEY idx_user_task (user_id, task_id)
  • KEY idx_user_status (user_id, status)
  • KEY idx_task (task_id)
  • KEY idx_expire (expire_at)

2.4 任务条件表 (task_conditions)

定义系统中所有可用的条件类型,每种条件类型对应一个处理器类,负责验证和更新该类型条件的进度。

字段名 类型 允许空 默认值 说明
id int 自增 主键
code varchar(50) - 条件代码(唯一),如'login', 'plant', 'harvest'
name varchar(100) - 条件名称,如'登录游戏', '种植作物', '收获作物'
description varchar(255) NULL 条件描述
param_schema json NULL 参数模式,定义此条件需要的参数及其类型
handler_class varchar(255) NULL 处理此条件的类名
is_active tinyint 1 是否激活(0:否, 1:是)
created_at timestamp NULL 创建时间
updated_at timestamp NULL 更新时间

索引:

  • PRIMARY KEY (id)
  • UNIQUE KEY idx_code (code)

2.5 任务达成条件表 (task_achievement_conditions)

关联任务和具体的条件,定义了完成任务需要满足的条件。一个任务可以有多个条件,通过这个表可以实现复杂的任务逻辑。条件分为两种类型:前置条件和进度条件。

字段名 类型 允许空 默认值 说明
id int 自增 主键
task_id int - 任务ID,外键关联task_tasks表
condition_id int - 条件ID,外键关联task_conditions表
condition_type varchar(20) 'progress' 条件类型('prerequisite'=前置条件,'progress'=进度条件)
target_value int 1 目标值,如需要完成的次数
params json NULL 条件参数,如特定物品ID、特定作物ID等
operator varchar(10) '=' 运算符,如'=', '>=', '<='
sort_order int 0 排序顺序,用于多条件任务
is_required tinyint 1 是否必须满足此条件(0:否, 1:是)
created_at timestamp NULL 创建时间
updated_at timestamp NULL 更新时间

索引:

  • PRIMARY KEY (id)
  • KEY idx_task_id (task_id)
  • KEY idx_condition_id (condition_id)
  • KEY idx_task_condition (task_id, condition_id)
  • KEY idx_condition_type (condition_type)

2.6 用户任务进度表 (task_user_progress)

存储用户任务的详细进度信息,关联到具体的任务达成条件。

字段名 类型 允许空 默认值 说明
id int 自增 主键
user_id int - 用户ID
task_id int - 任务ID,外键关联task_tasks表
achievement_condition_id int - 达成条件ID,外键关联task_achievement_conditions表
current_value int 0 当前值
last_update_time timestamp NULL 最后更新时间
created_at timestamp NULL 创建时间
updated_at timestamp NULL 更新时间

索引:

  • PRIMARY KEY (id)
  • UNIQUE KEY idx_user_task_condition (user_id, task_id, achievement_condition_id)
  • KEY idx_user_task (user_id, task_id)
  • KEY idx_achievement_condition (achievement_condition_id)

2.7 任务完成日志表 (task_completion_logs)

记录用户完成任务的详细信息,用于审计和数据分析。

字段名 类型 允许空 默认值 说明
id int 自增 主键
user_id int - 用户ID
task_id int - 任务ID,外键关联task_tasks表
completed_at timestamp - 完成时间
time_spent int NULL 完成耗时(秒)
ip_address varchar(45) NULL IP地址
device_info varchar(255) NULL 设备信息
created_at timestamp NULL 创建时间

索引:

  • PRIMARY KEY (id)
  • KEY idx_user (user_id)
  • KEY idx_task (task_id)
  • KEY idx_completed_at (completed_at)

2.8 任务奖励发放日志表 (task_reward_logs)

记录任务奖励的发放情况,包括奖励内容、发放时间等。

字段名 类型 允许空 默认值 说明
id int 自增 主键
user_id int - 用户ID
task_id int - 任务ID,外键关联task_tasks表
user_task_id int - 用户任务ID,外键关联task_user_tasks表
rewards json - 奖励内容(JSON格式)
rewarded_at timestamp - 奖励发放时间
ip_address varchar(45) NULL IP地址
device_info varchar(255) NULL 设备信息
created_at timestamp NULL 创建时间

索引:

  • PRIMARY KEY (id)
  • KEY idx_user (user_id)
  • KEY idx_task (task_id)
  • KEY idx_user_task (user_task_id)
  • KEY idx_rewarded_at (rewarded_at)

2.9 任务重置日志表 (task_reset_logs)

记录任务重置的情况,包括重置类型、重置时间、影响的任务数等。

字段名 类型 允许空 默认值 说明
id int 自增 主键
reset_type varchar(20) - 重置类型(daily, weekly, monthly)
reset_time timestamp - 重置时间
affected_tasks json NULL 受影响的任务ID列表(JSON格式)
affected_count int 0 受影响的任务数量
created_at timestamp NULL 创建时间

索引:

  • PRIMARY KEY (id)
  • KEY idx_reset_type (reset_type)
  • KEY idx_reset_time (reset_time)

3. 数据关系

3.1 主要关系图

task_categories 1 --< task_tasks
task_conditions 1 --< task_achievement_conditions
task_tasks 1 --< task_achievement_conditions
task_tasks 1 --< task_user_tasks
task_achievement_conditions 1 --< task_user_progress
task_user_tasks 1 --< task_completion_logs
task_user_tasks 1 --< task_reward_logs

3.2 关系说明

  1. 一个任务分类可以包含多个任务
  2. 一个条件类型可以用于多个任务达成条件
  3. 一个任务可以有多个达成条件
  4. 一个任务可以被多个用户接取
  5. 一个任务达成条件可以有多个用户进度记录
  6. 一个用户任务完成后会生成一条完成日志
  7. 一个用户任务领取奖励后会生成一条奖励发放日志

4. JSON字段结构

4.1 条件参数模式 (param_schema)

{
  "properties": {
    "seed_ids": {
      "type": "array",
      "items": {"type": "integer"},
      "description": "指定种子ID列表"
    },
    "land_type": {
      "type": "integer",
      "description": "指定土地类型"
    },
    "min_level": {
      "type": "integer",
      "description": "最低等级要求"
    }
  }
}

4.2 奖励内容 (rewards)

{
  "items": [
    {"item_id": 1001, "quantity": 10},
    {"item_id": 1002, "quantity": 5}
  ],
  "experience": 100,
  "special_rewards": {
    "type": "unlock_feature",
    "feature_id": 3
  }
}

4.3 前置任务 (prerequisite_tasks)

{
  "required_tasks": [101, 102],     // 必须完成的任务ID
  "optional_tasks": [103, 104],     // 可选完成的任务ID
  "min_optional_count": 1           // 最少需要完成的可选任务数
}

5. 索引设计考虑

5.1 高频查询场景

  1. 获取用户当前进行中的任务

    • 使用 idx_user_status 索引优化
  2. 获取特定类型的可用任务

    • 使用 idx_typeidx_active_time 索引优化
  3. 检查用户是否完成特定任务

    • 使用 idx_user_task 索引优化
  4. 获取即将过期的任务

    • 使用 idx_expire 索引优化

5.2 写入优化

  1. 任务进度更新是高频操作,使用 task_user_progress 表分担 task_user_tasks 表的写入压力

  2. 日志表(task_completion_logs, task_reward_logs)可考虑按时间分区,提高写入性能

6. 数据迁移与升级策略

  1. 使用Laravel迁移文件管理表结构
  2. 版本化迁移文件,支持回滚
  3. 大型结构变更时考虑分步迁移,减少对系统的影响

7. 条件处理器设计

每种条件类型都有一个对应的处理器类,负责验证和更新该类型条件的进度。

7.1 条件处理器接口

interface ConditionHandlerInterface
{
    /**
     * 验证事件是否满足条件
     *
     * @param array $event 事件数据
     * @param array $params 条件参数
     * @return bool
     */
    public function matches(array $event, array $params): bool;

    /**
     * 计算事件对条件进度的贡献值
     *
     * @param array $event 事件数据
     * @param array $params 条件参数
     * @return int
     */
    public function calculateProgress(array $event, array $params): int;

    /**
     * 检查条件是否已完成
     *
     * @param int $currentValue 当前值
     * @param int $targetValue 目标值
     * @param string $operator 运算符
     * @return bool
     */
    public function isCompleted(int $currentValue, int $targetValue, string $operator): bool;
}

7.2 基础条件处理器

abstract class BaseConditionHandler implements ConditionHandlerInterface
{
    /**
     * 检查条件是否已完成
     *
     * @param int $currentValue 当前值
     * @param int $targetValue 目标值
     * @param string $operator 运算符
     * @return bool
     */
    public function isCompleted(int $currentValue, int $targetValue, string $operator): bool
    {
        switch ($operator) {
            case '=':
                return $currentValue == $targetValue;
            case '>=':
                return $currentValue >= $targetValue;
            case '>':
                return $currentValue > $targetValue;
            case '<=':
                return $currentValue <= $targetValue;
            case '<':
                return $currentValue < $targetValue;
            default:
                return false;
        }
    }
}

8. 任务进度更新流程

8.1 事件触发

  1. 用户执行操作(如登录、种植、收获等)
  2. 系统触发相应的事件

8.2 条件匹配

  1. 任务服务接收事件
  2. 查找与事件相关的所有活跃任务的进度条件
  3. 对每个条件,调用对应的处理器验证事件是否匹配

8.3 进度更新

  1. 对于匹配的条件,计算进度贡献值
  2. 更新用户任务进度表中的当前值
  3. 检查条件是否已完成

8.4 任务完成检查

  1. 当进度条件完成时,检查任务的所有必要的进度条件是否都已完成
  2. 如果所有必要的进度条件都已完成,将任务标记为已完成
  3. 触发任务完成事件

9. 前置条件与进度条件的区别

9.1 前置条件

前置条件是指用户必须满足才能接取任务的条件,但不计入任务的完成进度。前置条件的特点:

  1. 检查时机:在用户接取任务时检查
  2. 完成状态:只有“满足/不满足”两种状态,没有进度概念
  3. 典型例子
    • 用户等级要求(如“需要等级10级才能接取”)
    • 前置任务要求(如“需要完成任务A才能接取”)
    • 特定物品要求(如“需要拥有特定物品才能接取”)

9.2 进度条件

进度条件是指用户需要完成才能完成任务的条件,有明确的进度计算。进度条件的特点:

  1. 进度跟踪:有明确的当前值和目标值
  2. 动态更新:随着用户操作不断更新进度
  3. 典型例子
    • 种植作物(如“种植5次小麦”)
    • 收获作物(如“收获10个苹果”)
    • 使用物品(如“使用3次化肥”)

9.3 处理流程差异

  1. 前置条件处理

    • 在用户尝试接取任务时检查
    • 如果不满足,拒绝接取并返回原因
    • 不需要记录进度
  2. 进度条件处理

    • 接取任务后持续跟踪
    • 根据用户操作更新进度
    • 在用户任务进度表中记录当前值
    • 当所有必要的进度条件都满足时,完成任务

10. 任务示例

10.1 简单任务:每日登录

任务名称:每日登录
任务描述:今天登录游戏
任务类型:daily
条件:
  - 类型:login
  - 目标值:1
  - 参数:{}
  - 运算符:=
奖励:
  - 金币 x 100

10.2 多条件任务:农场管理

任务名称:农场管理大师
任务描述:种植3种不同作物,收获10次,升级1次土地
任务类型:weekly
条件:
  - 类型:plant
    目标值:3
    参数:{"seed_ids": [101, 102, 103, 104, 105]}
    运算符:>=
    是否必须:是
  - 类型:harvest
    目标值:10
    参数:{}
    运算符:>=
    是否必须:是
  - 类型:upgrade_land
    目标值:1
    参数:{}
    运算符:>=
    是否必须:是
奖励:
  - 高级化肥 x 3
  - 金币 x 500

10.3 带前置条件的任务示例

任务名称:高级农场主
任务描述:已经达到农场等级10级的玩家,可以尝试种植高级作物
任务类型:achievement
前置条件:
  - 类型:level_check
    目标值:10
    参数:{"level_type": "farm"}
    运算符:>=
    条件类型:prerequisite
  - 类型:task_completed
    目标值:1
    参数:{"task_ids": [101, 102]}
    运算符:>=
    条件类型:prerequisite
进度条件:
  - 类型:plant
    目标值:5
    参数:{"seed_ids": [201, 202]}
    运算符:>=
    条件类型:progress
    是否必须:是
  - 类型:harvest
    目标值:20
    参数:{"crop_ids": [301, 302]}
    运算符:>=
    条件类型:progress
    是否必须:是
奖励:
  - 稀有种子 x 1
  - 金币 x 1000

11. 数据维护

11.1 数据清理策略

  1. 定期清理过期的用户任务数据(可设置保留期限)
  2. 日志表数据可考虑归档处理
  3. 使用软删除机制,避免直接删除重要数据

11.2 数据备份策略

  1. 与系统整体备份策略保持一致
  2. 关键操作前进行数据备份
  3. 定期验证备份数据的完整性