問題タブ [hierarchical-data]
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 - それらの子なしで子カテゴリを取得するにはどうすればよいですか?
これが私の声明です:
それはうまく機能しますが、サブカテゴリの子なしで、選択したカテゴリ(ここでは「製品」)の隣の最初のノードのみを取得するように変更したいと思います
のように:製品:
TypeA
SubTypeA
SubTypeB
TypeB
'TypeA'、'TypeB'を取得したい。
ちなみに、ここに私のテーブルがあります:
mysql - MySQLのメニューテーブルから一貫したメニューツリーデータを取得する
解決できないツリー/祖先/クエリの問題があります:
メニューデータを保持するテーブルと、メニューのすべての祖先を含むテーブルがあります。
次の方法で、すべてのアクティブなメニューエントリとその祖先を簡単に取得できます。
しかし、どうすればツリーに必要な祖先のすべてを取得できますか?私の結果では、一貫したツリーを取得するために、エントリFooandNewsが必要になります。次のようになります。
クエリはどのようになりますか?
database - DB 設計/レイテンシー/並行性、ひどい頭痛の種
いくつかのテーブルからすべてのデータを取得し、何かを再計算して保存するクライアント/サーバー アプリケーションがあります。
例:
各アイテムには「部品表」があります。これは、それを構成する他のアイテムのリストと数量です。したがって、アイテムのコストは、BOM 内のアイテムのコスト * 数量の合計です。最終的に、一部の「ベース」アイテムには BOM がなく、コストが個別に設定されているだけです。(すなわち: 原材料)
例: A の BOM には、2xB と 3xC で構成されていると記載されています。
私が今していることは、なぜこのようにするのか覚えていませんが、DB からすべてのアイテムとすべての BOM を取得し、一度に各アイテムのコストを再帰的に計算することです。1 つのアイテムを計算したら、フラグを立てて、コストを再度やり直さないようにします。(無限再帰も防ぎます)
問題は、これはちょっとばかげているということです。まず、その速度は遅く、変更されていないものを再計算します。さらに悪いことに、十分な大きさの DB を与えると、メモリが不足します。
代わりに、必要に応じてアイテムを再計算できます。アイテムの BOM が変更された場合、その BOM を再計算し、この更新されたアイテムを含むすべての BOM を選択し、それらも再計算します。変更されたアイテムに依存する DB 内の BOM がない最上部に到達するまで、すすぎ、再帰的に繰り返します。
これが実際に意味すること: 一部のアイテムは原材料であり、そのコストは頻繁に更新される可能性があり、一部のアイテムは BOM がほとんど変更されない「エンドユーザー」のものであるとします。ユーザーがこれらの材料の 1 つのコストを変更すると、何千ものアイテムを調べて再計算することになる場合があります。1 つのアイテム/BOM の SELECT に 15 ミリ秒かかるとします (私は Postgresql を使用しています)。1000 のアイテム/BOM を選択するだけで 15 秒かかるため、再計算されたコストを DB のアイテムに更新する必要があります...ああ親愛なる、遅延は数分に変わる可能性があります。
私が働いている会社が使用しているERPソフトウェアは、最初のアプローチを採用しています。つまり、DB全体を一度にバッチ再計算します。これには文字通り何時間もかかり、10年以上の使用でこのアプローチでは問題が蓄積されているようです. バッチ再計算は毎週行われます。
実際に「これを大声で書いた」ので、数分かかることはあまり問題ではないと思います。問題は、私がデータベースをよく理解していないことと、同時実行性について心配していることです。アイテム A の更新には時間がかかるため、アイテム A が更新されている間に誰かが 2 番目のアイテム B を更新する可能性があります。更新しました。
アイテム D は上記の A と B から作られているとします。ユーザー 1 が A を更新すると、サーバー ソフトウェアは DB で数分間マスターベーションを開始し、最終的に D を更新します。しかし、その間にユーザー 2 が B を更新するため、サーバーは最終的に D を再度更新します。
Postgresql のトランザクションを使用すると問題は解決しますか? トランザクションはその時点での DB の状態で開始されるため、トランザクション 1 は D が A1 と B1 から作成され、A1 から A2 に更新されていることを確認しますが、トランザクションが終了してコミットする前に、トランザクション 2 が開始され、A1 も確認されます。そしてB1。T1 は、D = A2 + B1 を再計算してコミットします。しかし、T2 はすでに始まっており、新しい A、A2 は表示されません。そのため、最終的に D = A1 + B2 という DB にコミットしますが、これは正しくありません。D = A2 + B2 である必要があります。
また、一部の処理が重複し、サーバー時間が無駄になります。
T1 と T2 を並列ではなく順番に実行すると、答えは正しいのですが、ユーザー 2 はさらに長く待たなければなりません。また、トランザクションのグループが互いに関係がない場合 (完全に独立した... 依存関係ツリー。つまり、A=X+Y および B=N+M)、並列計算により正しい答えが得られ、さらに高速になります。ユーザー。
重要な注意: 順番に処理する場合でもトランザクションを使用するので、コストを再計算する関数を除いて、ソフトウェアの残りの部分はそのデータを並行して処理できます。
さて、この「プロセス・イン・シーケンス」全体は、もし....DBレイテンシがそれほど「ひどい」ものではないなら、それほど悪くはありません。たとえば、データ全体が RAM に保持される場合、1000 個のオブジェクトを通過するのは簡単です。ああ、でも、データのチャンクをディスク/RAM との間ですばやく移動し、キャッシング (DB を置き換える) を行うシステムを構築したとしても、それはうまくいきません。並行して作業できます。(上記の「重要な注意」)したがって、別のDBを構築することになります。少し速いかもしれませんが、それはばかげている/時間の無駄です。
各アイテムのコストを「キャッシュ」する理由は、それを使用するたびに再計算しないようにするためです。これは、限られたリソースを浪費するだけでなく、DB レイテンシが大きすぎ、同時実行の問題がさらに悪化するためです。
なぜ「彼ら」が大量にそれを行ったのか不思議ではありません...これは私の頭を悩ませています.
Q1: 「最適な」方法でこれをどのように解決しますか?
私の現在の理解から (つまり、以前は黙って無視していた同時実行性の問題に直面した後)、その関数にトランザクションを順番に使用させ、アプリの残りの部分はデータを並行して使用できると考えています。ユーザーに最適です。それが目標です。ユーザーにとっては最善ですが、システムの正確性は保証されています。
後でハードウェアを投入して、ソフトウェアのブラック マジックを使ってレイテンシを短縮できるかもしれませんが、今は自分に嘘をつき始めています。
また、過去 2 か月間、私はいくつかの明らかなこと (プログラミングに関係のないものもありました) に完全に目をつぶっていました。 | |
regex - 正規表現の問題:コンテキストでの一致
DelphiのGUIを説明する階層テキストを含む構造化ファイル(DFMファイル)があります。
このファイルがあり、TmyButton(マーク付き)のコンテキストにあるすべての「Color = xxx」行に一致する必要があるが、他のコンテキストには一致しないと仮定します。TMyButton-Context内には、より深い階層レベルはありません。
私はそれを2日間、多くの異なる試みで試しました。ここに私の不完全なパターンの一部があります:
(理由はわかりませんが、「$」の代わりに「\ r \ n」を使用する必要がありました...)。これをまとめる必要がありますが、他の「object xxx:yyy」と「end」の行を除く他の行を無視します。
助けていただければ幸いです。
sql - MySQL に保存されているカテゴリのブレッドクラムを生成します
MySQL では、次の方法でカテゴリを保存します。
カテゴリ: - カテゴリ ID - カテゴリ名 - 親カテゴリ ID
特定の category_id のトレイル/ブレッドクラムを生成する最も効率的な方法は何ですか?
たとえば、breadcrumbs(category_id): General > Sub 1 > Sub 2
理論的には無制限のレベルが存在する可能性があります。私はphpを使用しています。
更新:ネストされたセット モデルに関するこの記事 ( http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ) を見ました。面白そうに見えますが、カテゴリを動的に管理することについてどう思いますか? 事前にカテゴリを知っている場合のように、紙の上では簡単に見えますが、ユーザーがその場でカテゴリを作成/削除/編集できる場合はそうではありません...どう思いますか?
sql - SQL Server 2005 の階層クエリ
関連オブジェクトのチェーンを表す SQL Server 2005 のテーブル内にデータ構造があります。各オブジェクトは、多くのステップで置換できます。置換チェーン内のすべてのオブジェクトと各オブジェクトのリーフを返すクエリを実行したいと考えています。
データ:
結果は次のようになります。
再帰的な CTE は良い方法だと思いますが、それについて頭を悩ませることはできません。この問題の制約は、データベースが自分の管理下にないため、データ構造を変更できないことです。
asp-classic - 従来のASPで1つまたは複数のアレイを管理するための最良の方法は何ですか
PHPは連想配列を提供しますが、古典的なaspにはそのようなものはありません。次のような階層を作成してトラバースできるクラスまたは関数を探しています。
お気づきのように、階層の深さは不均一です。3、4、または5レベルの深さである可能性があります。データベース構造はさらに複雑です。一部のレコードでは地域レベルからデータの表示を開始する必要がありますが、他のレコードでは国から開始する必要があります。配列の配列は本当に役に立ちますが、ASPでは私の手は縛られています。
c# - 階層データを持つテーブルに基づいてlinqを使用して検索しようとしています
次の列を持つタイプというテーブルがあります。
ID レベル名 ParentID (親行の ID)
次の列を持つ ParentObject というテーブル。ID タイプ ID
4 つの異なるレベルがあります (さらに拡張される可能性があります)。
もし私が持っていたら
ID: 1 レベル: 0 名前: Level0 ParentID: null
ID: 2 レベル: 1 名前: Level1 ParentID: 1
ID: 3 レベル: 2 名前: Level2 ParentID: 2
ID: 4 レベル: 3 名前: Level3 ParentID: 3
ID: 5 レベル: 4 名前: Level4 ParentID: 4
ParentObject テーブルには、最下位レベルの ID を格納するだけでツリーを格納します。したがって、私が持っている ID が 4 の場合、ツリーが実際に Level0 -> Level1 -> Level2 -> Level3 になることがわかります。
基本的に、linq ステートメントなどで特定のタイプ、またはタイプ レベル 2 のすべてのオブジェクトを検索できる必要があります。
ParentObject テーブルに格納されている TypeID が 4 であるため、Level3 とします。
しかし、実際には、レベル 2 型の ID が 3 であるすべての ParentObject を検索したいと考えています。
格納されている ID はレベル 1 またはレベル 2 などである可能性があるため、これを行う最善の方法は何でしょうか?
可能であれば、できれば 1 つの linq ステートメントで。
php - カテゴリとそのサブカテゴリ(およびサブサブカテゴリ)のすべての製品の数を取得するにはどうすればよいですか?
カテゴリテーブルは次のようになります。
関係表:
任意の1つのカテゴリとその直接のサブカテゴリの製品数を簡単に取得できます。しかし、2つ以上のレベルがある場合、物事は厄介になります。
だから私の質問は、男性とそのサブカテゴリのすべての製品の数を取得するにはどうすればよいですか。またはシャツとそのサブカテゴリ?
どんなアイデアでも、ありがとう。
アップデート:
入れ子集合モデルがあることは知っていますが、現在、構造をそれに変更する立場にはありません。
sql - SQL データベース内のレコードの階層を決定する
エレガントな解決策があるかどうか疑問に思っていた問題があります。これは本当のビジネス上の問題であり、クラスの課題ではありません!
何千ものレコードを含むテーブルがあり、そのうちのいくつかは互いに関連するグループです。
データベースは SQL 2005 です。
ID は主キーです。レコードが以前のレコードを置き換えた場合、そのレコードの ID は REP_ID 列にあります。
したがって、この例では、A が元の行で、B が A を置き換え、C が B の置き換えに失敗し、D が B の置き換えに成功し、最後に E が D を置き換えました。
このテーブルのすべてのレコードをグリッドに表示できるようにしたいと考えています。次に、ユーザーが任意のグループの任意のレコードを右クリックできるようにし、システムが関連するすべてのレコードを見つけて何らかのツリーに表示できるようにしたいと考えています。
これで明らかに力ずくで解決できますが、コミュニティにもっとエレガントな答えが見られるかどうか尋ねたいと思います。