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

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

  • 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-а

Оцени публикацию:
  • 1,5
Оценили человек: 1

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

Новые заметки:

Про что мы забываем когда делаем оценку задачи по времени

Список вопросов для собеседования разработчика по телефону

Symfony2 авторизация без Doctrine2 для чайника

Phpstorm7 LiveEdit

Жесткий хабр или не хабр, тогда кто?

Яндекс.Деньги мошенничество

Как узнать какие страницы в поиске яндекса или это секрет

Последние комменты:

Yapro CMS:

Здравствуйте, Гость | Войти | Регистрация | Карта сайта | RSS ленты | Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » MySQL »