За последние 24 часа нас посетили 23192 программиста и 2015 роботов. Сейчас ищут 853 программиста ...

Nested Sets

Тема в разделе "Прочие вопросы по PHP", создана пользователем udodirc, 8 июн 2010.

  1. udodirc

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

    С нами с:
    14 мар 2008
    Сообщения:
    111
    Симпатии:
    0
    Здраствуйте, есть вопрос по Nested Sets. Кто работал с этим алгоритмом знает, что там при добавление узла в дерево необходимо обновить ключи таким запросом
    [sql]UPDATE my_tree SET right_key = right_key + 2, left_key = IF(left_key > $right_key, left_key + 2, left_key) WHERE right_key >= $right_key [/sql]
    а потом уже вбивать узел вот таким запросом
    [sql]INSERT INTO my_tree SET left_key = $right_key, right_key = $right_key + 1, level = $level + 1[/sql]
    получается, что надо сначала обновить ключи, а потом добавлять узел. Но если при обновлении произойдет аппаратный сбой или ошибка в программе, то узел может быть не добавлен. Произойдет обновление ключей, а узел не будет добавлен. Такое можно исправить транзакцией, сделать эти два дейтвия за одну транзакцию, а вот можно ли это сделать как-нибудь без транзакции?
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Можно, в "временной" таблице.
    Создаем новую таблицу
    Выбираем в нее дерево и там апдейтим ключи.
    Затем добавляем туда же узел.
    Если все успешно, то дропаем исходную таблицу, а новую переименовываем.

    Но, как по мне, транзакции удобнее.
     
  3. udodirc

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

    С нами с:
    14 мар 2008
    Сообщения:
    111
    Симпатии:
    0
    Конечно транзакцией удобней, но не на всех хостах есть InnoDB.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Можно при выборке - если обнаруживается, что значения ключей не соответствует узлам, то пересчитывать и обновлять ключи.
    Хотя хосты, на которых нет даже InnoDB - это плохие хосты, ими не надо пользоваться :)
     
  5. Scorpius

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

    С нами с:
    6 май 2010
    Сообщения:
    59
    Симпатии:
    0
    Адрес:
    там уже нет
    Причём тут InnoDB?
     
  6. udodirc

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

    С нами с:
    14 мар 2008
    Сообщения:
    111
    Симпатии:
    0
    Только в InnoDB есть поддержка транзакций, или я не прав?
     
  7. udodirc

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

    С нами с:
    14 мар 2008
    Сообщения:
    111
    Симпатии:
    0
    Не посоветуете ли мне хороший хост с InnoDB, которым вы пользовались.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632