I need to design a 'task manager' table structure where task can be dependent on other tasks. For example I can have following tasks:
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
Each task has standard properties (started_by, assigned_to, due_date, description, status). I want to have a table structure that would allow me to do this query easily:
Currently my solution is to have 2 tables:
My current query for above scenario and my current table structure goes like this:
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
This get's me the right result, but is this the right way to go or should I make better table structure and/or query?
Here is also SQL fiddle for above scenario.
Don't know why this has gone unanswered for so long. What you've suggested is absolutely the right way - tasks
and task_dependencies
. It's already normalized properly and allows you to pick the required info in one query, indexed on the right columns.
Minor suggestions:
The query isn't wrong but perhaps better to avoid the all-dep-task-selecting subquery and put it as:
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
Should optimize better. (I assume there's some error in my query, couldn't sqlfiddle test it. But you get the idea.)
The task_dependencies
table doesn't need a separate PK. What you could instead do is have a complex PK for task_id
and dep_task_id
. Though it is considered good practice to have the separate PK, and put task_id+dep_task_id
as a unique key.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With