Схема базы данных для хранения филиалов / слияний в сети зависимостей - PullRequest
0 голосов
/ 01 февраля 2012

Мне нравится модель вложенных множеств для хранения иерархических данных, и я хотел бы найти аналогичную модель для хранения зависимостей задач в приложении для управления проектами.

Проблема 1: Неустойчивая сложность рекурсивных запросов к базе данных / вызовов функций:

Сейчас у меня есть простая таблица m: n, в которой хранятся пары задач / блокировщиков, но в лучшем случае циклический просмотр данных неоптимизирован, а в худшем - рекурсивный кошмар. Я хотел бы ограничить вызовы базы данных в узком цикле и - с "нормальным" деревом - я бы использовал вложенный набор для достижения этой цели.

Проблема 2: множественное наследование, множественное наследование

Причина, по которой я не могу использовать дерево, состоит в том, что этот набор содержит не только ветви, но и слияния. Некоторые задачи имеют несколько «родительских узлов» - если хотите - несколько задач, которые имеют должно быть завершено, прежде чем он может начать. Это похоже на то, как я предполагаю, что SVN или Git должны работать для хранения информации о версиях.

Я хочу выполнить такие запросы, как:

  • Получить все задачи, рекурсивно, в зависимости от конкретной задачи (обход сверху вниз)
  • Добавить все оценки времени для конкретной задачи и всех ее зависимостей (обратный ход)
  • Ограничение списка потенциальных зависимостей для задачи логическими параметрами (не может зависеть от самого себя в цикле)

Возможные варианты:

  • Ударить пулю и справиться со сложностью
  • Индексируйте все последовательности («маршруты», если хотите, чтобы завершить все задачи) - все еще не знаете, как сохранить это
  • Хранить вложенные наборы сверху вниз и вложенные наборы снизу вверх
  • Молитесь, чтобы какой-нибудь гуру StackOverflow знал больше, чем я, по этому вопросу

Какой самый лучший способ (и насколько вы уверены, что он будет работать)?

1 Ответ

0 голосов
/ 01 февраля 2012

Я бы начал с таблиц задач и заданий.
Используйте таблицу task_relationships для нескольких родителей или детей.
отношение задачи имеет родительские и дочерние поля, оба являются идентификаторами в таблице задач.

...