На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Деревья , Firebird 1.5
    Есть необходимость организовать хранение деревьев каталогов в БД. Структура должна быть оптимальной для быстрого нахождения пути от корня дерева до некоторого листа.
    Пока думаю сделать хранение дерева с помощью Nested sets, там указанный поиск реализуется просто и работает вроде быстро, однако встает еще задача выбора всех потомков заданного узла, лежащих ровно на 1 уровень ниже этого узла (выборка всех файлов и подкаталогов заданного каталога) и как ее делать просто (а не сотней последовательных запросов, если таких потомков будет 100 штук) я что-то пока не догоняю. Есть у кого какой-нить опыт в этом деле?
      чесно говоря не в курсе, что такое Nested sets,но могу предложить структуру, типа такой:

      id Integer;
      parent_id integer;
      parent_path varchar(<>)
      поле parent_path содержит полный путь к от корня к родителю текущего узла в строковом виде.
      заполняется, естественно в триггере
        Про nested sets написано, например, тут:
        http://ibase.ru/devinfo/DBMSTrees/9603d06.html
        http://ibase.ru/devinfo/DBMSTrees/9604d06.html
        http://ibase.ru/devinfo/DBMSTrees/9605d06.html

        Сейчас происходит написание ТЗ и утрясание сопуствующих вопросов и я пока только прикидываю, как буду делать. Вариант без извращений, конечно, лучше, если заказчику не захочется каких-нибудь дополнительных извращений.

        Т.к. в программировании БД я практически ничего не понимаю, у меня еще вопросец назрел:
        Вставка поддерева в дерево, организованное с помощью вложенных множеств (тех самых nested sets) включает в себя две фазы: перенумерация части вершин дерева и, собственно, вставка новых вершин. Собственно меня волнует что произойдет, при попытке двух клиентов добавить разные поддеревья в одно дерево одновременно. Перенумерации должны выполняться строго последовательно (неважно какая выполнится раньше, главное, чтобы для перенумерации, выполняющейся позже были видны изменения, которые внесла первая), иначе нарушится целостность структуры данных. Как этого добиться на Firebird 1.5?
          Цитата n0rd @
          Про nested sets написано, например, тут:


          Цитата n0rd @

          Т.к. в программировании БД я практически ничего не понимаю

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

          Цитата n0rd @
          перенумерация части вершин дерева

          нафиг? я те продложил простой способ безовсяких перенумераций..

          Цитата n0rd @
          Перенумерации должны выполняться строго последовательно (неважно какая выполнится раньше, главное, чтобы для перенумерации, выполняющейся позже были видны изменения, которые внесла первая)

          ну выполняй перенумерацию эту в контексте одной транзакции...
            Цитата n0rd @
            Собственно меня волнует что произойдет, при попытке двух клиентов добавить разные поддеревья в одно дерево одновременно. Перенумерации должны выполняться строго последовательно (неважно какая выполнится раньше, главное, чтобы для перенумерации, выполняющейся позже были видны изменения, которые внесла первая), иначе нарушится целостность структуры данных. Как этого добиться на Firebird 1.5?

            Тебя это не должно волновать :) Блокировки-то при изменении есть. То есть, транзакция, пытающаяся изменить данные, которые изменены активной транзакцией, получает отлуп. Если уж хочешь окончательной уверенности - блокируй таблицу...
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0305 ]   [ 15 queries used ]   [ Generated: 14.10.24, 00:13 GMT ]