За последние 24 часа нас посетили 26787 программистов и 1482 робота. Сейчас ищет 951 программист ...

Вложенные множества

Тема в разделе "PHP для новичков", создана пользователем machetero, 16 янв 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Объясните, кто может, что такое правый ключ(right key) и левый ключ(left key) во вложенных множествах(nested sets). С level и id всё понятно.
    PS Если я вообще правильно перевёл термин.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    айди - уникальный идентификатор самой записи. он не зависит от нетсет сетс вообще.
    левел - уровень вложенности элемента
    левый-правый ключи - собственно то благодаря чему дерево из таблицы (а в реляционных базах именно таблицы) можно развернуть в граф (в сетевую базу). математика там достаточна проста для понимания.
    изучал http://www.getinfo.ru/article610.html ?
     
  3. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Да изучал, в принципе я кроме этой статьи ничего путного не нашёл.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    machetero а что конкретно не понятно?
     
  5. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    И там сразу практика. А основы теории нету.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    основа там очевидная, по right key можно выбрать всю ветку потомков, а по left key левую, очень удобно, level это количество в глубь веток
     
  7. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вот я бы понял если left key это был бы минимальный айди а right key максимальный. И они вместе описывают все элементы которые дальше идут. Но там вроде всё по другому.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ничего они не описывают и к идентификаторам не относятся. они относятся к сохранности структуры дерева. вернее представления дерева в таблице.

    на самом деле ключи относительно просты для понимания.
    ты стоишь во входной двери своей квартиры. это корень дерева. как пить дать твою хату можно представить в виде графа. так вот.
    каждая дверь - это родитель, а каждое окно - сток.
    и вот ты идешь по правой стене. всегда по правой стене.

    входя в дверь (квартиры/комнаты/туалета) оставляешь ей некоторое число.
    подходя к окну - еще одно.
    пройдя окно - еще одно.
    выйдя из комнаты - еще одно.

    каждый раз выдавая число ты его просто инкрементишь.

    так вот, на входе/подходе (к двери/к окну) ты ставишь левый ключ, а на выходе/проходе (из комнаты/мимо окна) - правый.
    таким образом ты обойдешь всю хату (держа всегда стены справа) и окажешься опять во входной двери. не забудь выйдя из нее раздать ей правый ключ.

    такой вот нехитрой манипуляцией ты раздашь всем веткам и листам входящим в граф левые и правые ключи.

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

    навскидку не припомню какой еще математике они должны отвечать... но пока надеюсь этого достаточно.
     
  9. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Ну впринципе получается ключи это тоже своеобразные идентификаторы ?
    PS Закидайте меня тухлыми помидорами если я туплю =)

    Добавлено спустя 1 минуту 17 секунд:
    Они ведь что то описывают
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    macheto, ключи нужны для того, чтобы за один проход выбрать потомков. Расставляются по принципу, описанному Ganzal. На картинке видно, что у всех потомков узла left будет больше, чем его собственный, а right - меньше. Для этого они и расставляются именно в таком порядке
    [​IMG]
     
  11. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    И вот например ещё. Как определить по ключам есть там дальше ветвление или за этим элементом идут тока конечные элементы.

    Добавлено спустя 1 минуту 15 секунд:
    Всё кажется я начинаю понимать... Это просто цифры не более...
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    У элемента, у которого нет "потомков", right = left + 1. А вот что "потомки" являются только листьями, пожалуй, по ключам не определишь
     
  13. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Вообще в реляционной БД связи между таблицами должны быть вида 1:М или М:1. Поэтому понятия left-key и right-key лишь говорят с какой стороны этой связи находится таблица - со стороны М или 1.
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Maputo, здесь Nested Sets обсуждаются, причём здесь ваши реляционные связи? Nested Sets (вложенные множества) - создание иерархии внутри одной таблицы, к реляционным связям не имеют никакого отношения
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да нет же, ну. Ганзал же описал логику их выставления. В мкрамер даже офигенную картинку привел. Если в выставлении чисел есть логика - значит они уже не просто числа, а числа, из которых можно извлечь полезные данные.
    Как пример - количество вложенных элементов вида ((r_key-1) - l_key))/2.
    Возьмем квадрат в центре второго ряда на картинке. левый ключ 10, правый 23. Ставим в формулу:
    ((23-1)-10) = (22-10)/2 = 12/2 = 6
    Вуаля! Мы знаем, что под этим элементом хранится еще 6. И для этого нам не нужно было обходить всю структуру. Будь там 6, 600, или 6000000 элементов, мы затратим одинаковое количество времени на то, чтобы узнать их количество.
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Проиллюстрирую на шкурном примере: реферальная система. Каждый может "привести друга". Если ваш "друг" что-то купит, то вам пирожок. И тому кто вас привел тоже пирожок. И выше по пирамиде.

    Определить кому причитается бонус очень просто: берем `left` даного пользователя за X и выбираем всех пользователей, чьи `left` и `right` содержат в себе этот X.
    Всех предков одним запросом, опа!
    Код (PHP):
    1. … WHERE :x BETWEEN `left` AND `right` 
    Если в расчете надо ограничить вложенность, то поможет сравнение level.
     
  17. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Fell-x27, artoodetoo, спасибо. мне кажется сейчас я действительно понял что такое левый/правый ключ. и для чего они нужны.