我需要设计一个“任务管理器”表结构,其中任务可以依赖于其他任务。例如我可以有以下任务:
TASK A: independent
TASK B: independent
TASK C: can not start before TASK B is finished
TASK D: independenet
TESK E: can not start before TASK C and TASK E are finished
每个任务都有标准属性(started_by、assigned_to、due_date、description、status)。我想要一个表结构,让我可以轻松地进行此查询:
- 选择所有用户打开的任务,但只选择那些已经可以启动的(意思是上面场景中的任务C和E在依赖任务完成之前不能在这里选择)。
目前我的解决方案是有 2 张桌子:
- 任务:保存任务记录的表
- task_dependencies:保存任务到任务依赖关系的表(id、task_id、dependent_task_id)
我对上述场景的当前查询和我当前的表结构如下所示:
SELECT description, from_unixtime( date_due )
FROM tasks
WHERE
assigned_user_id = 751
AND status_id = 'Q'
AND id NOT
IN (
SELECT TD.task_id
FROM task_dependencies TD
INNER JOIN tasks T ON TD.dependent_task_id = T.id
AND T.status_id = 'Q')
ORDER BY date_due
-- status 'Q' = new uncompleted task
这让我得到了正确的结果,但这是正确的方法还是我应该做出更好的表结构和/或查询?
这也是上述场景的SQL 小提琴。