Ребят, помогите! есть такая структура БД: rubric (категории) id_rubric, name, parent_id event (события) id_event, title, parent_id выглядит так: Спорт -футбол -баскетбол ... Культура -танцы -выставки ... как при нажатии на категорию "Спорт", вывести события из ее дочерних категорий? я хз, всякие join'ы пробую, но может все гораздо глубже? ) помогите, может ссылочку какую или совет p.s.: и что делать с уровнями вложенности, если их например три?
Во-первых подозреваю, что в event поле называется не parent_id, а id_rubric. Должна же там быть ссылка на категорию? Выбор оптимального решения зависит от разных факторов. Есть техника Nested Sets (гугли и нагуглится тебе), но она неэффективна, если в таблица постоянно меняется, т.к. это приводит к изменению кучи записей. Смотри также Materialized Path. В ней желательно знать сколько по максимуму будет уровней вложенности и сколько разрядов понадобится под нумерацию на каждом уровне. Такое описание как у тебя (id, parent_id) называется Adjacency List. Дает максимум свободы для вставки/изменения узлов. Для выборок оно не очень удобно. Приходится выполнять несколько запросов чтобы получить под-дерево. Хотя можно что-то кешировать на стороне PHP. Совет: читай, попробуй каждый способ. Примеров много!
да неэффективна при модификации самого дерева, так как требуется много перестроить значений. НО! зато самая эффективная при выборке целиком, кусками, поддеревьями и т.д. деревья в БД используют для структур типа каталогов. а они меняются ОЧЕНЬ редко(да и то админом). так что в 90% случаев это лучший выбор. готовых классов море. бери и пользуйся.
А комментарии лесенкой? Когда каждый может ответить на любой комментарий... По-моему, PostgreSQL умеет делать всякие такие выборки деревьев-поддеревьев одним запросом. Вроде, "рекурсивные запросы", называется. Хотя, может я что-то не так понял, когда читал. На практике не использовал.
поэтому я и написал в 90% случаев а не в 100%. идеальных инструментов несуществует. каждый нужно использовать для своей задачи. Для postgresql есть модуль LTREE, реализация сходная с Materialized Path Oracle поддерживает деревья "из коробки". CONNECT BY PRIOR ... START WITH ... реализация сходная с Parent ID
Есть "родные" деревья в постгрес и оракл, но это уж совсем далеко человека послать ))) Цель не стоит средства. Есть всякие нестандартные, но красивые решения с деревьями. Вот нашел — за счет избыточности можем выбрать из A.L. поддерево за один запрос. http://www.sql.ru/articles/mssql/2005/061904treesinsqldatabases.shtml
кстати, в движке livestreet (это типа движка как Хабр) для комментариев используется как раз Nested Set. так что очень даже гибкое решение