Мне нравится модель вложенных множеств для хранения иерархических данных, и я хотел бы найти аналогичную модель для хранения зависимостей задач в приложении для управления проектами.
Проблема 1: Неустойчивая сложность рекурсивных запросов к базе данных / вызовов функций:
Сейчас у меня есть простая таблица m: n, в которой хранятся пары задач / блокировщиков, но в лучшем случае циклический просмотр данных неоптимизирован, а в худшем - рекурсивный кошмар. Я хотел бы ограничить вызовы базы данных в узком цикле и - с "нормальным" деревом - я бы использовал вложенный набор для достижения этой цели.
Проблема 2: множественное наследование, множественное наследование
Причина, по которой я не могу использовать дерево, состоит в том, что этот набор содержит не только ветви, но и слияния. Некоторые задачи имеют несколько «родительских узлов» - если хотите - несколько задач, которые имеют должно быть завершено, прежде чем он может начать. Это похоже на то, как я предполагаю, что SVN или Git должны работать для хранения информации о версиях.
Я хочу выполнить такие запросы, как:
- Получить все задачи, рекурсивно, в зависимости от конкретной задачи (обход сверху вниз)
- Добавить все оценки времени для конкретной задачи и всех ее зависимостей (обратный ход)
- Ограничение списка потенциальных зависимостей для задачи логическими параметрами (не может зависеть от самого себя в цикле)
Возможные варианты:
- Ударить пулю и справиться со сложностью
- Индексируйте все последовательности («маршруты», если хотите, чтобы завершить все задачи) - все еще не знаете, как сохранить это
- Хранить вложенные наборы сверху вниз и вложенные наборы снизу вверх
- Молитесь, чтобы какой-нибудь гуру StackOverflow знал больше, чем я, по этому вопросу
Какой самый лучший способ (и насколько вы уверены, что он будет работать)?