@romicohen
WebDev

Как в Eloquent (или ActiveRecord) получить всех потомков n-ного уровня, в таблице с полями id и parent_id? Нужны ли воспомогательные таблицы?

Есть таблица с полями id и parent_id - как наименее ресурсозатратно получить всех потомков n-ного уровня, используя ларавелевский Eloquent?

Это вообще реально, или нужно raw-запросы писать на SQL?

Годится ли MySQL 5.7 или нужен непременно 8-й? Я вроде слышал что там что-то новое появилось для иерархических деревьев. Или может вообще какой-нибудь Postgre взять?

Насколько вообще реально это реализовать только в одной таблице? Ибо я полагаю, что если записей будет over 1M, и нужно будет получить потомков глубже 3 уровня - то там начнется какой-нибудь кошмар, да?

В общем, если кто знаком с этой темой по личному опыту - буду рад совету.

Спасибо.
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Нужны ли воспомогательные таблицы?

Да, желательно.

Это вообще реально, или нужно raw-запросы писать на SQL?

Чтобы было еще быстрее - да. А без дополнительной таблицы - тем более да.
Вот как делать: https://www.percona.com/blog/2011/02/14/moving-sub...

Ибо я полагаю, что если записей будет over 1M

Индексы решат проблему с миллионом. А еще проблему миллиона решает взгляд на то, что если ты решил "вывести на страницу миллион" - то ты что-то не так обсудил с заказчиком. Человеку от 20 записей уже становится голове тяжело, а лям - это забей.

Есть паттерн Closure Table (я рекомендую его), есть паттерн Nested Sets (для меня тяжелый в чтении, и средний в реализации) и есть паттерн Path Enumeration (самый простой при реализации, и без дополнительной таблицы, но в итоге может не всё) и опирается на WHERE LIKE %path/to/parent%.

Все они реализуют дерево в таблице, позволяя избежать необходимости поддержки рекурсивных запросов, которая в MySQL есть только в более поздних версиях и есть в постгресе. Но честно, я когда разбирался в WITH RECURSIVE понял что с паттернами легче было.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы