具有任务依赖性的任务管理器应用程序的MySQL表结构

时间:2013-09-19 08:53:19

标签: mysql sql database-design

我需要设计一个“任务管理器”表结构,其中任务可以依赖于其他任务。例如,我可以执行以下任务:

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)。我希望有一个表格结构,可以让我轻松地进行这个查询:

  1. 选择所有用户的打开任务,但只选择那些已经启动的任务(意味着在上面的场景中,在完成依赖任务之前,不能在此处选择任务C和E)。
  2. 目前,我的解决方案是拥有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 fiddle

1 个答案:

答案 0 :(得分:2)

不知道为什么这么长时间没有得到答复。您所建议的绝对是正确的方式 - taskstask_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_iddep_task_id的复杂PK。虽然将单独的PK作为一个好的做法,并将task_id+dep_task_id作为一个唯一的密钥。