タグ付けされた質問 「hierarchy」

アイテムを順序付けられたレベルに配置することに関連する問題。

3
階層型フィールドの最高レベルを検索:CTEありとなし
注:この質問は、現在MySQLを使用していることを反映するように更新されました。これを行ったので、CTEをサポートするデータベースに切り替えるとどれほど簡単になるかを知りたいと思います。 主キーidと外部キーを持つ自己参照テーブルがありますparent_id。 +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL …

3
親子ツリー階層順序
SQL Server 2008 R2のデータをフォローする必要があります。SQLFiddle スキーマ: CREATE TABLE [dbo]。[ICFilters]( [ICFilterID] [int] IDENTITY(1,1)NOT NULL、 [ParentID] [int] NOT NULL DEFAULT 0、 [FilterDesc] [varchar](50)NOT NULL、 [アクティブ] [tinyint] NOT NULL DEFAULT 1、 CONSTRAINT [PK_ICFilters] PRIMARY KEY CLUSTERED ([ICFilterID] ASC)WITH PAD_INDEX = OFF、 STATISTICS_NORECOMPUTE = OFF、 IGNORE_DUP_KEY = OFF、 ALLOW_ROW_LOCKS = ON、 ALLOW_PAGE_LOCKS = ON )ON …

5
本番環境でHierarchyIdを使用している人はいますか?信頼できますか?
数千行以上の適切なサイズのテーブルで、実際の運用でHierarchyIdを使用している人はいますか?信頼性/性能はありますか?これまでのところ、ベンダーと提携していない人がそれを推奨しているのを発見していません。PaulNielsenはここでこれに反対しています。 実際の運用システムでHierarchyIdを使用した経験は何ですか? 代わりにHierarchyIdを選択したときに、どの基準を使用しましたか?

3
各ノードにランダムな数の子がある複数レベルの階層を作成する
階層を含むテストデータを作成する必要があります。私はそれを簡単にし、いくつかのことをすることができましたが、それCROSS JOINは私に完全に均一な/変化のない構造を与えるでしょう。それは鈍いように見えるだけでなく、テストデータの変動がないために、他の方法では見つからない問題を隠してしまうことがあります。だから、私はこれらのルールに従う不均一な階層を生成したいと思っています: 深さ3レベル レベル1はランダムに5〜20ノードです レベル2は1〜10ノードで、レベル1の各ノードごとにランダムです レベル3は1〜5ノードで、レベル2の各ノードごとにランダムです すべてのブランチは3レベルの深さになります。この時点で深さの均一性は問題ありません。 任意のレベルで子ノードの名前が重複する可能性があります(つまり、子ノードの名前は、同じレベルのすべてのノードで一意である必要はありません)。 ここで「ランダム」という用語は、一意にランダムではなく、疑似ランダムであると定義されています。「ランダム」という用語は「複製を生成しない特定のセットのランダムな順序」を意味するためによく使用されるため、これについて言及する必要があります。ランダム=ランダムを受け入れ、レベル1の各ノードあたりの子の数が4、7、および8のみである場合、レベル1の20のノードでさえ、それらのノードごとに1-10の子の潜在的な広がりがある場合、それは問題ありません、なぜならそれがランダムであるからです。 これは入れ子にすると非常に簡単にできますが WHILEループを使用してますが、設定ベースのアプローチを見つけることが優先ます。一般的に、テストデータの生成にはプロダクションコードに必要な効率性の要件はありませんが、セットベースのアプローチの撮影はより教育的であり、問​​題に対するセットベースのアプローチを見つけるのに役立つでしょう。したがって、WHILEループは除外されませんが、セットベースのアプローチが不可能な場合にのみ使用できます。 Set-based =理想的には、CTE、APPLYなどに関係なく、単一のクエリです。したがって、既存またはインラインの数値テーブルを使用するのが適切です。WHILE / CURSOR /手続き型アプローチを使用しても機能しません。操作がすべてセットベースでループがない限り、データの一部を一時テーブルまたはテーブル変数にステージングすると思います。ただし、そうは言っても、複数クエリアプローチの方が実際に優れていることが示されない限り、単一クエリアプローチの方が複数のクエリよりも好まれます。「より良い」を構成するものは通常主観的であることに注意してください;-)。また、前の文での「通常」の使用も主観的であることに留意してください。 SQL Serverのすべてのバージョンとエディション(2005年以降、私は推測します)で対応します。 純粋なT-SQLのみ:その愚かなSQLCLRのものはありません!! 少なくともデータの生成に関しては。ディレクトリとファイルの作成は、SQLCLRを使用して行われます。しかし、ここでは、作成するものの価値を生成することに焦点を当てています。 T-SQL Multi-statement TVFは、外部ではセットの手続き型アプローチをマスクしているにもかかわらず、セットベースではなく手続き型と見なされます。それが絶対に適切な場合があります。これは当時のものではありません。それらと同じ線に沿って、T-SQLスカラー関数も手続き型であるという理由だけでなく、クエリオプティマイザーが値をキャッシュして、出力が期待どおりにならないように繰り返すこともあります。 T-SQLインラインTVF(別名iTVF)は、セットベースであるため、okey-dokey [ CROSS | OUTER ] APPLYであり、上記のok として説明したを使用するのと実質的に同じです。 クエリを繰り返し実行すると、前回の実行とほとんど異なる結果が生成されます。 明確化の更新1:最終結果セットは、レベル1で始まるフルパスを持つ、レベル3の個別のノードごとに1つの行を持つように表現する必要があります。これは、単一のLevel3ノードのみを含む単一のLevel2ノードしかない場合を除いて、Level1とLevel2の値が必ず1つ以上の行にわたって繰り返されることを意味します。 明確化の更新2:番号だけでなく、名前またはラベルを持つ各ノードに非常に強い優先順位があります。これにより、結果として得られるテストデータがより有意義で現実的になります。 この追加情報が重要かどうかはわかりませんが、何らかのコンテキストが役立つ場合に備えて、テストデータはこの質問に対する私の回答に関連しています。 XMLファイルをSQL Server 2012にインポートする この時点では関係ありませんが、この階層を生成する最終目標は、ディレクトリ構造を作成して、再帰的なファイルシステムメソッドをテストすることです。レベル1と2はディレクトリになり、レベル3はファイル名になります。私は周りを検索しました(ここでもGoogle経由でも)で、ランダムな階層を生成するための参照が1つだけ見つかりました。 Linux:ランダムなディレクトリ/ファイル階層を作成する (StackOverflowでの)その質問は、テスト用のディレクトリ構造を作成しようとするため、実際には望ましい結果の点で非常に近いです。しかし、その質問(および回答)はLinux / Unixシェルスクリプトに焦点を当てており、私たちが住んでいるセットベースの世界ではありません。 これで、ランダムデータを生成する方法がわかりました。また、バリエーションを表示できるように、ファイルのコンテンツを作成するために既にそうしています。ここで注意が必要なのは、特定のフィールドではなく、各セット内の要素の数がランダムであることです。また、各ノード内の要素の数は、同じレベルの他のノードからランダムである必要があります。 階層の例 Level 1 Level 3 |---- …

4
SQLを使用してリレーショナルデータベースでツリー状のデータを走査する
SQLでツリーデータをトラバースする方法はありますか?私connect byはOracleで知っていますが、他のSQL実装でこれを行う別の方法はありますか?connect by各結果に対してクエリを実行するループまたは再帰関数を作成するよりも使用する方が簡単だからです。 「ツリーデータ」というフレーズに混乱しているように見える人もいるので、さらに説明しparent_idます。つまり、同じテーブル内の別の行の主キーを含む、または同様のフィールドを持つテーブルに関してです。 問題は、この方法でOracleデータベースに保存されたデータを操作していて、connect by他のDBMSに実装されていないことを知っていた経験からです。標準SQLを使用する場合は、上位にしたい親ごとに新しいテーブルエイリアスを作成する必要があります。これは簡単に手に負えなくなる可能性があります。

2
HierarchyIdでツリーブランチをロード/読み取るためのセットベースの方法はありますか
HierarchyIdをいじっていますが、次のことを行うためのセットベースの方法を理解していません。 すべてのサブツリーを一度に挿入する 一度にすべてのサブツリーを取得する この質問は以前の質問に関連しており、HierarchyIdでこれらの2つのタスクを実行する唯一の方法は、一度に1つのノードまたは1つのレベルであると思われます。実体化されたパスを使用している場合、両方のアクションは、単一の(そして些細な)セットベースのコマンドによって簡単に実行されます。 私は何が欠けていますか? 編集:サブツリーを移動する方法も見逃しましたが、ミカエル・エリクソンのコメントからそれを学びました

3
Oracle:階層テーブルを照会するにはどうすればよいですか?
バックグラウンド これは、レポートに使用するいくつかのビューを作成するためのものです。 場所のテーブルがあり、キーフィールドは「場所」と「親」です。 これらの2つのフィールドが作成する構造は、レベルごとに、会社名->キャンパス名->建物名->フロア名->部屋名のラインに沿っています。この場合、会社名は変わりませんが、キャンパス名は変わりません。 ロケーションの構造は、通常、次のようになります。 +-----------+ | Org. Name | +-----+-----+ | +-----v-----+ +--------------------+|Campus Name|+---+--+-------------+ | +--+--------+ | | | | | | | | | | +--+-----+ +------+-+ +--+----+ +---+---+ +--+| BLDG-01|+--+ | BLDG-02| |BLDG-03| |Grounds| | +--------+ | +--------+ +-------+ +-------+ +-+------+ +-----+--+ |Floor-01| |Basement+-------+ +-+------+ +--------+ | …
10 oracle  query  view  hierarchy 

6
階層のあるテーブル:外部キーによる循環を防ぐための制約を作成します
次のように、テーブル自体に外部キー制約があるテーブルがあるとします。 CREATE TABLE Foo (FooId BIGINT PRIMARY KEY, ParentFooId BIGINT, FOREIGN KEY([ParentFooId]) REFERENCES Foo ([FooId]) ) INSERT INTO Foo (FooId, ParentFooId) VALUES (1, NULL), (2, 1), (3, 2) UPDATE Foo SET ParentFooId = 3 WHERE FooId = 1 このテーブルには次のレコードがあります。 FooId ParentFooId ----- ----------- 1 3 2 1 3 2 この種の設計が意味をなす場合(例:典型的な「従業員と上司と従業員」の関係)があり、いずれの場合も、スキーマにこれがある状況にあります。 …

1
テーブルに格納された階層内の階層的な権限
次のデータベース構造を想定します(必要に応じて変更可能)... ページと有効なアクセス許可を含む行を返すことができるように、特定のページで特定のユーザーの「有効なアクセス許可」を決定するための良い方法を探しています。 理想的なソリューションには、現在のユーザーの特定のページ行の「有効な権限」を評価するために必要な再帰を実行するためにCTEを使用する関数が含まれると考えています。 背景と実装の詳細 上記のスキーマは、コンテンツ管理システムの開始点を表しており、ロールにユーザーを追加したり、ロールからユーザーを削除したりすることで、ユーザーに権限を付与できます。 システム内のリソース(ページなど)はロールに関連付けられており、そのロールにリンクされたユーザーのグループに付与する権限を付与します。 すべてのロールを拒否し、ツリー内のルートレベルページをそのロールに追加して、ユーザーをそのロールに追加するだけで、ユーザーを簡単にロックダウンできるようにするという考え方です。 これにより、(たとえば)会社で働いている請負業者が長期間利用できない場合でも権限構造をそのままにしておくことができます。これにより、その1つのロールからユーザーを削除するだけで、元の権限を同じように付与することもできます。 。 アクセス許可は、これらのルールに従うことによってファイルシステムに適用される可能性がある一般的なACLタイプのルールに基づいています。 CRUD許可はヌル可能ビットにする必要があるため、使用可能な値はtrue、falseであり、以下の場合は定義されていません。 false +何か= false true +未定義= true true + true = true 未定義+未定義=未定義 いずれかの権限がfalseの場合-> false そうでない場合はtrue-> true その他(すべて未定義)-> false つまり、ロールメンバーシップを介して権限が付与され、拒否ルールが許可ルールをオーバーライドしない限り、何も許可されません。 これが適用される権限の「セット」は、現在のページまでのツリーに適用されるすべての権限です。つまり、このページのツリー内のページに適用されるロールにfalseがある場合、結果はfalseになります。ただし、ここまでのツリー全体が定義されていない場合、現在のページには真のルールが含まれ、結果はここでは真になりますが、親では偽になります。 可能な場合はdb構造を大まかに保持したいと思います。また、ここでの目標は次のようなことを実行できるようにすることです。select * from pages where effective permissions (read = true) and user = ?したがって、どのようなソリューションでも、有効なアクセス許可を持つクエリ可能なセットを許可する必要があります。何らかの方法で(基準を指定できる限り、それらを返すのはオプションです)。 2つのページが存在し、1つが他の子であり、2つの役割が存在すると仮定します。1つは管理ユーザー用で、もう1つは読み取り専用ユーザー用であり、どちらもルートレベルのページにのみリンクされ、期待どおりの出力として次のように表示されます。 Admin user: Id, Parent, …

2
hierarchyid CLRはオープンソースですか?
組み込みのhierarchyidは、パスを効率的なバイナリ形式で格納し、その他の便利な機能を提供するCLRです。 残念ながら、表現されたパスの深さには制限があり、バイナリツリーの場合は〜1427です。この制限に達することになっている複雑な既存のアプリケーションの制限を増やしたいと思います。タイプのインターフェースを変更したくありません。結果として変更する必要のあるすべてのコードに微妙なバグを導入せずに、型のインターフェイスを変更できるとは思えません。 (理論的には)hierarchyidと同じインターフェイスを実装する「binhierarchyid」CLR UDTを作成できますが、バイナリツリーのみをサポートします。これにより、900バイトの制限内にとどまったまま、深度が7000に達するはずです。それがどれほどの規模の事業になるかはわかりません。 このhierarchyid CLRのソースはどこかにありますか?

2
自己参照(階層)テーブルからツリー構造を取得できますか?
次のような階層テーブルがあるとします。 CREATE TABLE [dbo].[btree] ( id INT PRIMARY KEY , parent_id INT REFERENCES [dbo].[btree] ([id]) , name NVARCHAR(20) ); ツリー構造全体を取得したいのですが。 たとえば、次のデータを使用します。 INSERT INTO [btree] VALUES (1, null, '1 Root'); INSERT INTO [btree] VALUES (2, 1, '1.1 Group'); INSERT INTO [btree] VALUES (3, 1, '1.2 Group'); INSERT INTO [btree] VALUES (4, …

1
複数の親を持つ有向グラフを表す方法は?
http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.htmlは、クロージャーテーブルの挿入と削除のアルゴリズムを提供します。 ノードに複数の親がある場合を除いて、同様のデータ構造をモデル化したいと思います。 与えられた: 削除する[B, C]と、次のようになると予想します。 ノードを削除すると、次のようになりますB。 ただし、リンクまたはノードを削除するために作成者のアルゴリズムを使用すると、[D, C, 1]削除のタグが付けられることに気付くでしょう。これは望ましくありません。 これまでに試したこと references2つのノード間を移動する方法がいくつあるかを示す列を追加することにより、元のデータ構造を適応させてみました。上記の例では、からAまでC、Bまたはを経由して移動できますD。B削除されると、AtoへのパスCが保持され、参照カウントが2から1に減少すると考えられていました。理論的には良かったのですが、実装を機能させる方法を理解できなかったので、それはまったく可能です(データ構造には、削除する行を特定するのに十分な情報が含まれていない可能性があります)。 私が求めていること 複数の親をサポートするために、クロージャテーブルをどのように調整しますか?どの代替データ構造をお勧めしますか?https://stackoverflow.com/q/4048151/14731には、そのようなデータ構造の説得力のあるリストが含まれていますが、複数の親をサポートしている(または最適な)構造は明確ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.