我有一个表(id, parent_id, data)
,其中parent_id
指向同一个表中的另一行(或为空)。
有没有一种标准的方法来查询(1)某个id的所有祖先和(2)某个id的所有后代?
我也在DBIx::Class
中这样做,所以如果有一个最方便的方式来处理该模块(或其他一些),我也很乐意听到这个。
编辑:澄清 - 所有父母=所有祖先,所有儿童=所有后代。
答案 0 :(得分:3)
这在很大程度上取决于您使用的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 :(得分:1)
目前我们似乎会选择DBIx::Class::Tree::AdjacencyList
。它几乎几乎我正在寻找的一切(不幸的是没有祖先的结果集 - 但我们可以通过解决我们需要从另一个方向提出的问题来解决这个问题。)
然而,@ Grrrr的回答让我思考,我们可能会添加一个单独的表+模块(id, record_type, record_ancestors)
,它将附加到我们的模型,这些模型具有parent_id
列并提供ancestors
结果集(基本上通过执行search_rs,其中id是相关祖先行的分割,我们选择w / e分隔符)。为了得到这样的结果集,这是一项相当大的工作,所以我们可能只会去那里,如果我们发现问题“这是父母x的孩子是否真的很不切实际”并且确实需要“这是否是这个问题的父母”孩子x“?
编辑:或者我们可能会使用DBIx::Class::Tree::Mobius
- 虽然看起来像查看原始表格是不可理解的。