Запросы, чтобы получить все предки / потомки дерева в БД?
У меня есть стол (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