За последние 24 часа нас посетили 64857 программистов и 1740 роботов. Сейчас ищут 845 программистов ...

Вывод материалов из дочерних категорий

Тема в разделе "PHP и базы данных", создана пользователем TigerZaka, 30 окт 2012.

  1. TigerZaka

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

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Ребят, помогите!
    есть такая структура БД:
    rubric (категории) id_rubric, name, parent_id
    event (события) id_event, title, parent_id
    выглядит так:
    Спорт
    -футбол
    -баскетбол
    ...
    Культура
    -танцы
    -выставки
    ...

    как при нажатии на категорию "Спорт", вывести события из ее дочерних категорий?
    я хз, всякие join'ы пробую, но может все гораздо глубже? )
    помогите, может ссылочку какую или совет

    p.s.: и что делать с уровнями вложенности, если их например три?
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Во-первых подозреваю, что в event поле называется не parent_id, а id_rubric. Должна же там быть ссылка на категорию?

    Выбор оптимального решения зависит от разных факторов.
    Есть техника Nested Sets (гугли и нагуглится тебе), но она неэффективна, если в таблица постоянно меняется, т.к. это приводит к изменению кучи записей.
    Смотри также Materialized Path. В ней желательно знать сколько по максимуму будет уровней вложенности и сколько разрядов понадобится под нумерацию на каждом уровне.
    Такое описание как у тебя (id, parent_id) называется Adjacency List. Дает максимум свободы для вставки/изменения узлов. Для выборок оно не очень удобно. Приходится выполнять несколько запросов чтобы получить под-дерево. Хотя можно что-то кешировать на стороне PHP.

    Совет: читай, попробуй каждый способ. Примеров много!
     
  3. TigerZaka

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

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Спасибо! пошел читать
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    да неэффективна при модификации самого дерева, так как требуется много перестроить значений. НО!
    зато самая эффективная при выборке целиком, кусками, поддеревьями и т.д.

    деревья в БД используют для структур типа каталогов. а они меняются ОЧЕНЬ редко(да и то админом). так что в 90% случаев это лучший выбор. готовых классов море. бери и пользуйся.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А комментарии лесенкой? Когда каждый может ответить на любой комментарий...
    По-моему, PostgreSQL умеет делать всякие такие выборки деревьев-поддеревьев одним запросом. Вроде, "рекурсивные запросы", называется. Хотя, может я что-то не так понял, когда читал. На практике не использовал.
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    поэтому я и написал в 90% случаев а не в 100%.
    идеальных инструментов несуществует. каждый нужно использовать для своей задачи.

    Для postgresql есть модуль LTREE, реализация сходная с Materialized Path
    Oracle поддерживает деревья "из коробки". CONNECT BY PRIOR ... START WITH ... реализация сходная с Parent ID
     
  7. artoodetoo

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

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

    Есть всякие нестандартные, но красивые решения с деревьями. Вот нашел — за счет избыточности можем выбрать из A.L. поддерево за один запрос. http://www.sql.ru/articles/mssql/2005/061904treesinsqldatabases.shtml
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    кстати, в движке livestreet (это типа движка как Хабр) для комментариев используется как раз Nested Set. так что очень даже гибкое решение