Вся таблица замыканий является избыточной, если вы можете использовать рекурсивные запросы:)
Я думаю, что гораздо лучше иметь сложный рекурсивный запрос, который вы должны выяснить один раз, чем иметь дело с дополнительным вводом-выводом (и дискомпробел) отдельной таблицы и связанных с ней триггеров.
Я провел несколько простых тестов с рекурсивными запросами в postgres.С несколькими миллионами строк в таблице запросы все еще были <10 мс для возврата всех родителей конкретного ребенка.Возвращение всех детей тоже было быстрым, в зависимости от уровня родителя.Казалось, что это больше зависит от дискового ввода-вывода, извлекающего строки, а не от скорости самого запроса.Это было сделано для одного пользователя, поэтому не уверен, как он будет работать под нагрузкой.Я подозреваю, что было бы очень быстро, если бы вы также могли держать большую часть таблицы в памяти (и правильно настроить postgres).Кластеризация таблицы по родительскому идентификатору также, похоже, помогла. </p>