Вложени комплекти в MySQL

Всеки програмист рано или късно трябва да се справи с вложен набор (известен като дърво или йерархия) в релационни бази данни. В тази публикация ще опиша специален случай на работа с такъв набор - моделът вложени комплекти (по-долу просто вложени комплекти).

Вложени комплекти предполага даване на всеки възел в дървото по два допълнителни клавиша ляв и десен клавиш. За да попълним тези ключове, ще трябва да преминем изцяло цялото дърво, като посетим всеки от възлите два пъти. В резултат на това изборът от дървото ще бъде доста бърз. От друга страна, промяната на структурата изисква преизчисляване на всички ключове в възлите, следващи възела, който се променя.

В бази данни, които не поддържат рекурсивни заявки (например MySQL), изборът от дърво е по-бърз, отколкото ако е направен със съхранена процедура.

Промените в базата данни отнемат много време, тъй като трябва да актуализирате всички леви и десни клавиши в записите след променените.

Диаграмата показва прост пример за вложени набори:

Какви селекции могат да се правят?

  • Всички дървесни възли
    ИЗБЕРЕТЕ * ОТ дърво ПОРЪЧКА ПО left_key
  • Избор на дъщерни възли
    ИЗБЕРЕТЕ * ОТ дърво КЪДЕ left_key> = $ left_key И right_key = $ right_key ПОРЪЧАЙТЕ от left_key
  • Избор на клон, в който възелът участва
    ИЗБЕРЕТЕ * ОТ дърво КЪДЕ right_key> $ left_key И left_key

Конкретни примери

По време на работа се сблъсках със задачата да заредя класификатора OKDP в MySQL, който съдържа повече от 44 хиляди позиции, а предпоставка беше използването на модела на вложени комплекти. Класификаторът се разпространява като архив, който съдържа около 15 файла в XML формат.

Стана ясно, че би било много по-ефективно просто да заредите класификатора в базата данни и едва след това да изградите левия и десния клавиш. За това беше написана следната процедура, която ми свърши работа за 15 минути: