2013-09-19 3 views
5

Мне нужно создать структуру таблицы «диспетчер задач», где задача может зависеть от других задач. Например, я могу иметь следующие задачи:Структура таблицы MySQL для приложения диспетчера задач с зависимостями задач

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, описание, статус). Я хочу, чтобы иметь структуру таблицы, которая позволила бы мне сделать этот запрос легко:

  1. Выберите открытые задачи всех пользовательских, но выбрать только те, кто уже может быть запущен (то есть в приведенном выше сценарии ЗАДАЧА С и Е не может быть выбранных здесь, пока задачи зависимостей не будут завершены).

В настоящее время мое решение иметь 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 для вышеуказанного сценария.

ответ

2

Не знаю, почему это так долго не осталось без ответа. То, что вы предложили, является абсолютно правильным способом - tasks и task_dependencies. Он уже нормализовался должным образом и позволяет вам выбрать необходимую информацию в одном запросе, индексированном по правому столбцу.

Незначительные предложения:

  • запрос не неправильно, но, возможно, лучше, чтобы избежать все-отд-задачи, выбирая подзапрос и поставить его как:

    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. Хотя считается хорошей практикой иметь отдельный ПК, и поставить task_id+dep_task_id в качестве уникального ключа.

+0

У меня есть решение, реализованное на основе моего вопроса выше с небольшими изменениями. Я посмотрю, что вы предложили. Спасибо, что вызвали это. –

Смежные вопросы