Быстрые выборки в дереве данных

Автор: Aport Четверг, Январь 29th, 2015 Нет комментариев

Рубрика: Разное

В рамках данной статьи, мы рассмотрим видов выборок данных в иерархии разделов (в деревьях).

  • nested set - всего 1 минус, это перерасчет всего дерева lft rgt в случае с 1 корнем ( идеален в случае с 1-2k записей в бд и со средним уровнем вложенности 3-7 ). Дальше начинается проседание бд и никакие индексы, кеши и бла бла бла не спасают. Выборки будут мгновенные (я бы даже сказал молниеносные) а вот insert / update может достигать как 10 секунд так и по полминуты.
  • nested intervals -  на большом проекте слишком быстро выползает за лимиты поля в базе данных, даже с unsigned bigint
  • full hierarchy - используется там, где нельзя рушить структуру id, parent_id и нельзя вклиниваться в структуру бд, а иерархия нужна ( избыточность данных x3 )
  • materialized path - проблемные выборки вверх вниз с дочерними записями (хотя есть его модификации, но они тоже не ололо)

Стоит заметить, что nested set самый удобный вариант, все остальные можно не рассматривать как боевые решения, только для ознакомления деревьев, минусов и костылей при работе оч. много. К примеру full hierarchy и materialized path - не прижились, слишком много подводных камней.

Все зависит от задачи, где то плевать на избыточность и кучу join, где то нет.

В своих проектах использую какой либо из Nested (90%). Например Nested с мультирутами, с виртуальным рутом, с одним рутом.

  • мультирут - каждый новый корневой узел начинается с lft = 1 их может быть N
  • виртуальный рут - запись корневая с lft = 1 отсутствует физически и является виртуальной (на лету собирается в коде в виде объекта)
  • сингл рут - обычный нестед сет

Если нужно, могу описать преимущества и недостатки каждого подхода.

p.s. Если наткнетесь на хабре на статью про Full hierarchy (там чувак оптимистично рассказывает как изобрел хороший велосипед) не верьте. На практике оказывается, что 1 выборка в любую сторону выливается в 3-4 join-а

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты