同じテーブル内の別の行を指す (または null である) テーブルがあります(id, parent_id, data)
。parent_id
(1)特定のIDのすべての祖先と(2)特定のIDのすべての子孫を照会する標準的な方法はありますか?
私も でこれを行っているDBIx::Class
ので、そのモジュール (または他のモジュール) でこれを行う最も便利な方法があれば、それについても聞きたいです。
編集: 明確化 - すべての親 = すべての祖先、すべての子 = すべての子孫。
同じテーブル内の別の行を指す (または null である) テーブルがあります(id, parent_id, data)
。parent_id
(1)特定のIDのすべての祖先と(2)特定のIDのすべての子孫を照会する標準的な方法はありますか?
私も でこれを行っているDBIx::Class
ので、そのモジュール (または他のモジュール) でこれを行う最も便利な方法があれば、それについても聞きたいです。
編集: 明確化 - すべての親 = すべての祖先、すべての子 = すべての子孫。
これは、使用している SQL のフレーバーに大きく依存します。
START WITH id = yourid CONNECT BY PRIOR id = parent_id
Oracle では、構文を使用できます。PostgreSQL では、関数を使用できますconnectby('tablename', 'id', 'parent_id', 'id', value, 0)
。
多くの場合、ルート要素からこのノードまでの完全なパスをノードごとに保持する列を定義することにより、ツリーを異なる方法で表現することは理にかなっています。
この手法の例はインターネット上にたくさんあります。私が見た最新の例は、 http DBIx::Class
: //blogs.perl.org/users/ovid/2010/05/threaded . -フォーラム-sql.html
DBIx::Class::Tree::AdjacencyList
現時点では一緒に行くようです。私が探していたほとんどすべてのことを実行します (残念ながら祖先の結果セットはありませんが、別の方向から質問する必要がある質問にアプローチすることで、これを回避できます)。
しかし、@ Grrrrの答えは私に考えさせました.列(id, record_type, record_ancestors)
を持ち、結果セットを提供するモデルにアタッチする別のテーブル+モジュールを追加することができます(基本的に、idが関連する先祖行の分割にあるsearch_rsを実行することによって)選択した w/e 区切り記号によって)。そのような結果セットを取得するだけでもかなりの作業なので、「これは親 x の子ですか」と尋ねるのが実際的ではなく、「これは親 x子×」?parent_id
ancestors
編集:または多分使用しますDBIx::Class::Tree::Mobius
-テーブルを生で見るのは理解できないように見えますが。