3

同じテーブル内の別の行を指す (または null である) テーブルがあります(id, parent_id, data)parent_id

(1)特定のIDのすべての祖先と(2)特定のIDのすべての子孫を照会する標準的な方法はありますか?

私も でこれを行っているDBIx::Classので、そのモジュール (または他のモジュール) でこれを行う最も便利な方法があれば、それについても聞きたいです。

編集: 明確化 - すべての親 = すべての祖先、すべての子 = すべての子孫。

4

2 に答える 2

3

これは、使用している SQL のフレーバーに大きく依存します。

START WITH id = yourid CONNECT BY PRIOR id = parent_idOracle では、構文を使用できます。PostgreSQL では、関数を使用できますconnectby('tablename', 'id', 'parent_id', 'id', value, 0)

多くの場合、ルート要素からこのノードまでの完全なパスをノードごとに保持する列を定義することにより、ツリーを異なる方法で表現することは理にかなっています。

この手法の例はインターネット上にたくさんあります。私が見た最新の例は、 http DBIx::Class: //blogs.perl.org/users/ovid/2010/05/threaded . -フォーラム-sql.html

于 2010-08-16T14:47:10.517 に答える
1

DBIx::Class::Tree::AdjacencyList現時点では一緒に行くようです。私が探していたほとんどすべてのことを実行します (残念ながら祖先の結果セットはありませんが、別の方向から質問する必要がある質問にアプローチすることで、これを回避できます)。

しかし、@ Grrrrの答えは私に考えさせました.列(id, record_type, record_ancestors)を持ち、結果セットを提供するモデルにアタッチする別のテーブル+モジュールを追加することができます(基本的に、idが関連する先祖行の分割にあるsearch_rsを実行することによって)選択した w/e 区切り記号によって)。そのような結果セットを取得するだけでもかなりの作業なので、「これは親 x の子ですか」と尋ねるのが実際的ではなく、「これは親 x子×」?parent_idancestors

編集:または多分使用しますDBIx::Class::Tree::Mobius-テーブルを生で見るのは理解できないように見えますが。

于 2010-08-16T17:34:22.117 に答える