問題タブ [ltree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - ほとんどの子を持つ親を見つけるためのPostgresqlltreeクエリ。ルートを除く
私はPostgreSQLを使用しており、タイプが。のパス列を持つテーブルがありますltree
。
私が解決しようとしている問題は、ツリー構造全体を考えると、ルートを除いてどの親が最も多くの子を持っているかということです。
サンプルデータは次のようになります。
したがって、この例では、ID 1824(ルート)の行には11個の子があり、ID1928の行には深さ2の11個の子があります。これは私が求めている行です。
私はそのことに関してltreeとsqlに不慣れです。
(これは、Ltreeがほとんどの子を持つ親を見つけた後のサンプルデータが追加された改訂された質問ですpostgresqlが閉じられました)。
postgresql - PostgreSQLのパラメータとしてplpgsql関数でltreeクエリを使用する
plpgsql 関数で ltree パラメータを使用してクエリを実行したいのですが、この関数で引用符を使用する方法がわかりません...
これを行う方法 ???
psql でこのコードを実行すると、エラーが発生します。
最終作業バージョン:
java - JDBC の Java 型から Postgres ltree へ
Java 型が Postgres ltree 型にマップされることを知っている人はいますか?
次のようなテーブルを作成します。
挿入のカップル:
奇妙なことは何もありません。ここで、PreparedStatement を使用してこれをバッチ処理したいと思います。
}
これにより、次のエラーが生成されます。
明らかに私は何かが欠けています。JDBC ではなく純粋な SQL を使用して「何か」を挿入できるのはなぜですか?
postgresql - Postgre ltree 複数パス
さて、パスという列に ltree を持つテーブルがあります。複数のパスを選択したいのですが、OR ステートメントを大量に使用したくありません。それは可能ですか、それともこれが最善の方法ですか?
パス:
- 'schools.myschool.*'
- 「企業について*」
- 「testing.information.content.*」
クエリ:
SELECT content, path FROM threads WHERE path ~ 'schools.myschool.*' OR path ~ 'companies.about.*' OR path ~ 'testing.information.content.*
sql - Postgres ltree クエリ、ツリーの各レベルで結合されたアイテムを数える
私は3つのテーブルを持っています:
LOCATION、LOCATION DESCRIPTION は、各場所などの言語と STORE 用の 1 を保持します。
LOCATION DESCRIPTION テーブルは、以下のような ltree パス フィールドにも階層を保持します。
STORE テーブルは、それが属する場所を参照するための外部キー location_id を保持します。
だから私がやろうとしているのは、ノードごとに並べ替えられたストアの数を含むツリーを取得することです。
例えば:
私がこれまでに行ったことは、ツリーとカウント(店舗)を取得しますが、地区ではなくエリアのみで、必要な順序はありません。
================================================== ================================ EDIT1:
クエリを更新し、親と子の合計レコードを取得しました (もっと効率的な方法があると確信しています)。私はまだ注文を逃しています:
postgresql - パフォーマンスとGUIからのノード移動の両方に最適なPostgreSQL階層ツリー?
私は PostgreSQL を使用しているので、 ltreeと呼ばれるモジュールがあります。これは、私のニーズの少なくとも 1 つ、パフォーマンスを満たします (スケーラビリティについてはわかりませんか?具体化されたパス ツリーはうまくスケーリングしないと誰かが言います..)。
私が開発しているアプリケーションは完全に大きなツリー、ノード、サブツリーなどを中心に構築された CMS であるため、これらのノードをキューに入れる際のパフォーマンスは絶対に不可欠ですが、階層的な大きな (成長するにつれて) ツリーであるため、作業し、そこから操作します。 GUI (CRUD)、データベース内のツリー (子レコード) を正しく更新しながら、ユーザーがドラッグ アンド ドロップしてノード、サブツリーなどを並べ替えられるようにしたいと考えています。
ツリー内のノード/サブツリーの移動と並べ替えは、実際には ltree/マテリアライズド パス ツリーの目的ではないことを理解しています。パフォーマンスとサブツリーとノードの移動、またはおそらく... ltreeが実際に過去からの残り物ではなく、まだ使用する価値がある場合、PostgreSQLのltreeモジュールでこれをどのように達成できますか? この場合、なぜ/なぜ ltree を使用しないのですか?
要件:
- もちろん、クエリのパフォーマンスは私の最優先事項です (すべてのノード、サブツリー、リーフ)。
- ツリーは、深いレベルのネストとソートをサポートする必要があります
- そしてもちろん、ツリーは大規模な成長とスケーリングをサポートする必要があります
- 1 つの「なんでも屋」ツリーの実装が存在しない場合、または複雑すぎて価値がない場合は、GUI から再注文する間、少しの待ち時間を許容できます。
また、ブリッジ テーブルとも呼ばれる Closure テーブル (たくさん!)、Nested Intervals (正確な実装方法がわからず、適切な例や要点が現在存在しない?)、または B ツリー モデルも検討しています。これらが上記の4つの要件をどのように満たすか、まだよくわかりません。入れ子になった間隔でサブツリーとノードを再編成することは簡単に思え、パフォーマンスも良さそうです。適切なものを選択するのは非常に困難です。
私は間違いなくパフォーマンス(クエリ/読み取りパフォーマンス)、スケーラビリティ、ソートが必要なので、ソート順のあるクロージャーテーブルは非常に近いと思いましたが、クロージャーテーブルとディスクスペースのオーバーヘッドがツリーとしてどれだけ大きくなるか想像できませんノードが大きくなります。クロージャ テーブルとスケーラビリティについては、よくわかりません。これについて心配するのは間違っていますか?このタスクの最善の解決策は何ですか?
postgresql - PostgreSQL ltree- vs ツリー モジュール vs 整数/文字列配列または文字列区切りパス
ご存じかもしれませんが、ltree という PostgreSQL 用のモジュールがあります。また、整数に Array 型を使用することもできます (*1、以下のコメントを参照)。このテストでは、文字列のインデックス付けを除いて、ltree と比較して、再帰クエリで実際に少し遅く実行されることが示されています (*2、以下のコメントを参照してください)。
ただし、これらのテスト結果の信頼性についてはよくわかりません。
ここでの私の最大の質問は、実際には比較的知られていない、ほとんど文書化されていないツリー モジュールに関するものです。ここで説明されています(ドキュメントも見つけることができます!!):
階層データ型 (一種の辞書編集ツリー) のサポートは、適切なドキュメントがないため保留中の contrib/tree に移動する必要があり ます。
ドキュメントを読んだ後、大きなアプリケーション (すべてが階層ツリー構造に格納される CMS) をベースにする必要があるかどうかについて少し混乱しています。コンテンツだけでなく、ファイルなども見ることができます。これはすぐにスケールアップします) ltree を中心に、パスとして区切られた文字列または整数配列を持つ通常のマテリアライズド パス (パス列挙) - または、理論的には比較的未知の「ツリー」モジュールが、より高速に実行され、よりスケーラブルで、2 つのより優れたソリューションである必要がある場合.
私はすでにさまざまなツリー構造モデルを分析しており、クエリのパフォーマンス、スケーラビリティ、およびノードとサブツリーの並べ替えが主な要件であるため、隣接リストを除外することができました (ツリーが巨大になるため、再帰 CTE はパフォーマンスを解決しません) )、ネストされたセット/間隔(ツリーを操作するときの欠点を考慮すると、一部のクエリでは十分に高速ではありません)、クロージャーテーブル(複雑なツリーで大きくスケーリングするのはひどい-私のような大規模なプロジェクトには役に立ちません)などマテリアライズド パスは、読み取り操作が非常に高速で、サブツリーとノードを階層内で簡単に移動できます。したがって、問題は、Materialized Path の提案された実装の中で最も優れたものについてのみです。
PostgreSQL の「ツリー」に関するあなたの理論や経験を聞くことに特に興味があります。
json - PostgreSQL マテリアライズド パス / Ltree から階層的な JSON オブジェクトへ
PostgreSQL の ltree モジュールを使用して、このマテリアライズド パス ツリー構造を構築しました。
- id1
- id1.id2
- id1.id2.id3
- id1.id2.id5
- id1.id2.id3.id4 ...など
もちろん、ltree を使用して、ツリー全体または特定のパス/サブパスからすべてのノードを簡単に取得できますが、そうすると、当然、多くの行が得られます (これは、ノードの配列/スライスに相当します)。終了.. Golang/使用するプログラミング言語)
私が求めているのは、ツリーを取得することです-理想的には特定の開始および終了パス/ポイントから-etcのような階層的なJSONツリーオブジェクトとして
線形(非階層)行/配列/スライスの結果セットから、もちろんGolangでパスを展開し、必要なビジネスロジックを作成してこのjsonを作成できることを知っていますが、便利なこれを PostgreSQL で直接実現する方法。
では、PostgreSQL で ltree ツリー構造を json にどのように出力しますか?
ltree がわからない場合は、質問を「具体化されたパス ツリーから階層 json へ」に一般化できると思います。
また、ltreeパスに加えて、すべてのノードにparent_idを追加するという考えで遊んでいます.親IDの変更がいつ発生したかに基づいてパスを管理する(更新し続ける)ために、そのparent_idにトリガーを置くことを考えました-それは別の質問だと思いますが、おそらくこれについてあなたの意見も教えてもらえますか?
天才がこれを手伝ってくれることを願っています。:)
便宜上、時間を節約するために使用できる作成スクリプトのサンプルを次に示します。