За последние 24 часа нас посетили 16563 программиста и 1644 робота. Сейчас ищут 1260 программистов ...

Поиск по БД снизу вверх

Тема в разделе "PHP и базы данных", создана пользователем Basters, 18 апр 2011.

  1. Basters

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

    С нами с:
    2 янв 2008
    Сообщения:
    30
    Симпатии:
    0
    Адрес:
    Ростов на Дону
    Добрый день.

    у записи в БД может либо быть, либо не быть родителя, если родителя нет, то он сам родитель. короче дерево.

    пример

    id param1 param2 id_rod
    1 par par 0
    2 par1 par1 1
    3 par2 par2 2

    в итоге нужно вывести всё дерево, т.е. id 3,2 и главного родителя id 1.

    Что то ничего оптимального в голову не идет =(

    либо же как можно подобно переструктурировать бд для простоты?
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    при подобной организации хранения дерева - рекурсия. кстати, мускул 5 версии не поддерживает рекурсии хранимых процедур.

    довольно много про работу с деревьями описано тут http://www.php.ru/forum/viewtopic.php?t=27758
     
  3. Basters

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

    С нами с:
    2 янв 2008
    Сообщения:
    30
    Симпатии:
    0
    Адрес:
    Ростов на Дону
    в принципе построил и получилось собрать дерево IDшников, но если у кого то есть предложения по реструктурированию БД, просьба высказать)
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Basters
    в зависимости от величины дерева можно переложить часть работы на пхп. т.е. вытаскивать всю таблицу структуры, и уже внутри пхп собирать необходимый массив - работает быстрее, но только если дерево имеет не больше 500-1000 узлов.

    Если узлов много, то имеет смысл подгружать дерево динамически с помощью ajax-а. Либо же закешировать в файловой системе.

    Если дерево используется при поиске (т.е. найти статью во текущей категории и всех подкатегориях), то возможно стоит посмотреть в сторону Nested Sets либо же организовать ещё одну таблицу связей предок-потомок-уровень,
    таким образом можно вытаскивать все айдишки потомков, либо всех предков текущего узла всего одним запросом.
    Данный подход довольно удобен, но тяжело поддаётся модификации при переносе части дерева в другую часть.

    В большинстве случаев можно обойтись маленьким деревом и генерацией структуры уже в пхп, предварительно вытащив всё дерево одним запросом из базы.