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