我需要设计一个“任务管理器”表结构,其中任务可以依赖于其他任务。例如,我可以执行以下任务:
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)。我希望有一个表格结构,可以让我轻松地进行这个查询:
目前,我的解决方案是拥有2个表:
我对上述场景的当前查询和我当前的表结构如下:
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 fiddle。
答案 0 :(得分:2)
不知道为什么这么长时间没有得到答复。您所建议的绝对是正确的方式 - tasks
和task_dependencies
。它已经正常规范化,允许您在一个查询中选择所需信息,并在右侧列上编制索引。
小建议:
查询没有错,但最好避免使用all-dep-task选择子查询并将其设置为:
SELECT T.description, from_unixtime( T.date_due )
FROM tasks T
LEFT JOIN task_dependencies TD
ON TD.task_id = T.id
LEFT JOIN tasks T2
ON T2.task_id = TD.dependent_task_id
WHERE
T.assigned_user_id = 751
AND T.status_id = 'Q'
AND (T2.status_id != 'Q' OR T2.status_id IS NULL)
ORDER BY T.date_due
应该更好地优化。 (我假设我的查询中有一些错误,无法对它进行测试。但是你明白了。)
task_dependencies
表格不需要单独的PK。你可以改为做的是task_id
和dep_task_id
的复杂PK。虽然将单独的PK作为一个好的做法,并将task_id+dep_task_id
作为一个唯一的密钥。