web-dev-qa-db-ja.com

ツリーデータ構造のデータベース構造

データベースにカスタマイズ可能な(つまり、レベル数が不明なツリー構造の)ツリーデータ構造を実装する最良の方法は何でしょうか?

自分自身への外部キーを持つテーブルを使用する前に、これを一度実行しました。

他にどのような実装を見ることができますか?この実装は理にかなっていますか?

147
CodeMonkey1313

最も一般的に実装されている隣接リストに言及しています: https://blogs.msdn.Microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

マテリアライズドパスやネストされたセットなど、他のモデルもあります。 http://communities.bmc.com/communities/docs/DOC-9902

Joe Celkoは、このテーマに関する本を執筆しています。これは、一般的なSQLの観点からの優れたリファレンスです(上記のネストされたセットの記事のリンクで言及されています)。

また、Itzik Ben-Gannは、著書「Microsoft SQL Server 2005の内部:T-SQLクエリ」で最も一般的なオプションの概要を説明しています。

モデルを選択する際に考慮すべき主な事項は次のとおりです。

1)構造変化の頻度-ツリーの実際の構造が変化する頻度。一部のモデルは、より優れた構造更新特性を提供します。ただし、構造の変更を他のデータの変更から分離することが重要です。たとえば、会社の組織図をモデル化できます。一部の人々は、従業員IDを使用して従業員を上司にリンクし、これを隣接リストとしてモデル化します。これは通常、次善のアプローチです。よく機能するアプローチは、従業員自身とは別に組織構造をモデル化し、従業員を構造の属性として維持することです。このように、従業員が退職するとき、組織構造自体を変更する必要はなく、退職した従業員との関連付けのみを変更する必要があります。

2)ツリーは書き込みが多いか読み取りが多いか-一部の構造は、構造を読み取るときに非常にうまく機能しますが、構造に書き込むときに追加のオーバーヘッドが発生します。

3)構造から取得する必要がある情報の種類-構造に関する特定の種類の情報を提供する際にいくつかの構造が優れています。例には、ノードとそのすべての子の検索、ノードとその親の検索、特定の条件を満たす子ノードの数の検索などが含まれます。最適な構造を決定するには、構造から必要な情報を知る必要があります。あなたの要望。

74
JeremyDWill

MySQLでの階層データの管理 をご覧ください。リレーショナルデータベースに階層(ツリーのような)データを格納および管理するための2つのアプローチについて説明します。

最初のアプローチは、隣接リストモデルです。これは、基本的に説明するものです。テーブル自体を参照する外部キーを持ちます。このアプローチは単純ですが、ツリー全体の構築など、特定のクエリでは非常に効率が悪い場合があります。

この記事で説明した2番目のアプローチは、ネストされたセットモデルです。このアプローチは、はるかに効率的で柔軟です。詳細な説明とクエリの例については、記事を参照してください。

54
Ayman Hourieh

リレーショナルデータベースを使用してツリーデータ構造を整理する必要がある場合、Postgresqlにはクールなltreeモジュールがあり、階層ツリーのような構造に格納されたデータのラベルを表すデータ型を提供します。そこからアイデアを得ることができます(詳細については、 http://www.postgresql.org/docs/9.0/static/ltree.html を参照してください)

一般に、LDAPは階層構造でレコードを整理するために使用されます。

8
yurilo

それ自体への外部キーを持つテーブルを持つことは私にとって理にかなっています。

その後、SQLで共通テーブル式を使用するか、Oracleで前のステートメントで接続してツリーを構築できます。

2
Aaron Daniels

隣接関係リストモデルで使用できる、すぐに使用できる関数の素晴らしいコレクション。

http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html

2
Darshan

SQL SERVER 2005で次の実装を使用しました。Check here

1
emzero

MS SQL Server 2008以降を使用している人がこの質問を見つけた場合:SQL Server 2008以降には、このタスク専用に設計された新しい「hierarchyId」機能があります。

詳細は https://docs.Microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server

0
Alex