Запросы, чтобы получить все предки / потомки дерева в БД?

У меня есть стол (id, parent_id, data) где parent_id указывает на другую строку в той же таблице (или имеет значение null).

Существует ли стандартный способ запроса (1) всех предков определенного идентификатора и (2) всех потомков определенного идентификатора?

Я также делаю это в DBIx::ClassПоэтому, если есть наиболее удобный способ сделать это с этим модулем (или каким-либо другим), я бы тоже хотел услышать об этом.

РЕДАКТИРОВАТЬ: уточнить - все родители = все предки, все дети = все потомки.

2 ответа

Решение

Похоже, мы собираемся пойти с DBIx::Class::Tree::AdjacencyList в данный момент. Он выполняет почти все, что я искал (к сожалению, никаких результатов предков - но мы можем обойти это, подойдя к вопросам, которые нам нужно задать с другой стороны).

Однако ответ @Grrrr заставил меня задуматься, и мы можем добавить отдельную таблицу + модуль (id, record_type, record_ancestors) что бы прикрепить к нашим моделям, которые имеют parent_id столбец и предоставить ancestors набор результатов (в основном, выполняя search_rs, где идентификатор находится в разбиении соответствующей строки предков по выбранному нами разделителю w/e). Это довольно трудоемкая работа, чтобы получить такой набор результатов, поэтому мы, вероятно, пойдем туда только в том случае, если найдем вопросы, на которых действительно непрактично задавать вопрос: "это потомок родителя х" и действительно ли это нужно? ребенок х "?

РЕДАКТИРОВАТЬ: или, возможно, мы будем использовать DBIx::Class::Tree::Mobius - хотя, похоже, что просмотр таблицы необработанным будет непостижимым.

Это сильно зависит от вида используемого вами SQL.

В Oracle вы можете использовать START WITH id = yourid CONNECT BY PRIOR id = parent_id построить. В PostgreSQL вы можете использовать функцию connectby('tablename', 'id', 'parent_id', 'id', value, 0),

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

В Интернете можно найти множество примеров этой техники, самой последней из которых я видел, которая также касается DBIx::Class, можно найти здесь: http://blogs.perl.org/users/ovid/2010/05/threaded-forum-sql.html

Другие вопросы по тегам