問題タブ [transitive-closure-table]
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.
mysql - 推移的閉鎖テーブルの再構築
現在の構造から完全なツリーを取得したり、現在のテーブル構造をリファクタリングして最適化された再帰クエリを可能にしたりするにはどうすればよいでしょうか?
問題
反復せずにベース コンポーネントからコンポーネントの完全なツリーを取得できません。
1 つのコンポーネントは、定義されていない数の接続 (深さ) を持つことができます。
各コンポーネントは複数のコンポーネントに関連付けることができるため、コンポーネントには親プロパティがありません。
コンポーネントの影響を受ける属性値を再帰的に更新できません。たとえば、コンポーネントの価格が変更された場合、関連するすべての components_of の価格が更新されます。
現在の体制
成分
component_closure
結果のグラフ モデル:
クエリの例:
望ましい結果(*は再帰的に更新された値を示します)
すべてのコンポーネントの component_of 関係を取得し、深さ列を使用してコンポーネントの順序を決定できるように、ツリー関係全体を component_closure テーブルに格納する必要があると考えています。即時の components_of など、完全なツリーが必要ない場合は無駄に思えますが。
例えば:
python - 追加の子テーブルをクロージャテーブルの深さ列に置き換える方法は?
このブログ投稿に基づいてクロージャー テーブルを実装しようとしています。これは、sqlalchemy を使用したクロージャー テーブルの唯一の完全かつ機能的な実装を特徴としており、信用を与えるためにここにリンクしていますが、置き換えたいですchildren_table
(以下のコード例を参照)。内にdepth
-column を使用しclosure_table
ます。
問題は、この新しい列に値を設定する方法が本当にわからないことです.and 列は -class内で指定された関係を介して自動的に設定され、手がかりを見つけるための意味のある検索エンジンのキーワードが思い浮かびません。インタネットの中には。かなり長い間、sqlalchemy ドキュメントで解決策を見つけようとしましたが、この特定のタスクに適用される関連部分を認識するのは困難です。predecessor
successor
Category
sqlalchemy のスペシャリストが、コードのどの部分をどのように変更する必要があるかを教えてくれたり、少なくともドキュメントの正しい章を教えてくれたりして、より鋭い焦点を当てて自分で理解しようとし続けることができれば素晴らしいと思います.
私が知りたいことを明確にするために:SQLで深度値を計算して設定する方法を示す次のような回答があります:
しかし、最も重要な問題は、最初に -column に値を設定できるようにコードをどのように変更する必要があるかということですdepth
- 完全に機能する深さ列の目標に向けて取り組んでいます。誰かが完全な解決策を思いついたとしても、私は間違いなく気にしません... :-)
私のclosure_table
実行中の例では、すでに追加の列が含まれていますdepth
が、現時点では次のもののみが含まれていますNone
。
ただし、望ましい出力は次のようになります。
(children テーブルはもう必要ないため、コードから完全に削除されるため、children テーブルの出力を削除しました。)
太字の矢印は子テーブルを視覚化し、破線の矢印はクロージャー テーブルを表します。
mysql - MySQL 5.6 でのオプションの深さ制限を使用した再帰クエリ
2 つのテーブル スキーマ (MySQL 5.6 なので CTE なし) があり、おおよそ次のようになります。
私たちの設計では、(論理的に) 2 つのノード間の論理エッジn1 -> n2
は、実際n1 -> proxy node -> n2
にはデータベース内で ( ) として表されます。論理エッジに 2 つのエッジとプロキシ ノードを使用する理由は、エッジにプロパティを格納できるようにするためです。したがって、クライアントがエッジで接続された 2 つのノードをクエリすると、クエリは代わりに接続された 3 つのノードをクエリするように変換されます。
固定長のパスを取得するクエリを作成しました。たとえば、「いくつかのプロパティを持つノードで始まり、いくつかのプロパティを持つノードで終わり、パス上に正確に 5 つのエッジがあるすべてのパスを教えてください。」これは、SQL 側で再帰を使用せずに行われます。指定された固定長で長いクエリをプログラムで生成するだけです。
課題は、可変長パスのクエリをサポートしたいということです。たとえば、「いくつかのプロパティを持つノードで始まり、いくつかのプロパティを持つノードで終わるすべてのパスを教えてください。パス上に 3 つ以上のエッジと 10 個以下のエッジがあります。」これは CTE なしで (または CTE を使用しても) 実行可能ですか?
編集:
いくつかのサンプルデータ:
クエリは、「パスが 'foo' という名前のノードで始まり、'bar' という名前のノードで終わるように、パス上のすべてのノードの ID と名前を選択します。少なくとも 2 つのノードと最大 4 つのノードがあります。道に。」このようなパスには、、、、、1 -> 3 -> 5
およびが含ま1 -> 3 -> 5 -> 7
れます。したがって、結果セットにはノード 1、3、5、7、9 の ID と名前が含まれているはずです。3 -> 5
3 -> 5 -> 7
3 -> 5 -> 7 -> 9