Запросы, чтобы получить всех предков / потомков дерева в БД? - PullRequest
3 голосов
/ 16 августа 2010

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Это сильно зависит от вида используемого вами 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

1 голос
/ 16 августа 2010

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

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

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

...