1. 任务表(task)
作用:存储任务的基本信息,如任务名称、描述、负责人、创建时间、状态等。
示例结构:
CREATE TABLE task (id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL COMMENT '任务标题',
description TEXT COMMENT '任务描述',
assignee_id BIGINT COMMENT '负责人ID',
status ENUM('pending', 'running', 'paused', 'completed', 'cancelled') DEFAULT 'pending' COMMENT '任务状态',
priority TINYINT DEFAULT 3 COMMENT '优先级:1-高,3-中,5-低',
start_time DATETIME COMMENT '计划开始时间',
end_time DATETIME COMMENT '计划结束时间',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_assignee (assignee_id),
INDEX idx_status (status),
INDEX idx_start_end (start_time, end_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 任务进度表(task_progress)
作用:记录任务的进度变更历史,支持按时间查看进度变化,适合做统计分析。
示例结构:
CREATE TABLE task_progress (id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id BIGINT NOT NULL COMMENT '关联任务ID',
progress_percent DECIMAL(5,2) NOT NULL DEFAULT 0.00 COMMENT '进度百分比,0.00~100.00',
remark VARCHAR(500) COMMENT '进度说明',
recorded_by BIGINT COMMENT '记录人ID',
recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (task_id) REFERENCES task(id) ON DELETE CASCADE,
INDEX idx_task_progress (task_id, recorded_at),
INDEX idx_recorded_by (recorded_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 设计要点说明
为什么分开两张表?
任务主信息稳定,而进度是动态变化的,拆分有利于维护历史记录。 避免频繁更新任务表导致锁竞争或日志膨胀。 支持查看“谁在什么时候把任务推进到了多少”。如何获取当前任务进度?
从 task_progress 表中取每个任务最新的那条记录:
SELECT tp.task_id, tp.progress_percent, tp.recorded_at, tp.remarkFROM task_progress tp
INNER JOIN (
SELECT task_id, MAX(recorded_at) AS max_time
FROM task_progress
GROUP BY task_id
) latest ON tp.task_id = latest.task_id AND tp.recorded_at = latest.max_time;
是否可以在 task 表中加一个 current_progress 字段?
可以,但建议仅作为冗余字段用于快速查询,真实数据仍以 task_progress 为准,通过触发器或应用层同步更新。
