mysql - データベース階層構造-異なるノード表現

原文 mysql database database-design hierarchical-data

リレーショナルデータベース内の階層構造のモデル化に関するフィードバック/ガイダンスを探しています。私の要件は、ツリー内のすべてのノードが異なるタイプのデータを表すことができるツリー構造が必要であることを述べています。例えば:

組織

部門1

従業員1
従業員2
オフィス機器1
オフィス機器2


部門1

チーム1


オフィス機器3



上記の例では、組織、部門、従業員、オフィス機器、チームはすべて、データベース内の異なるテーブルであり、異なるプロパティが関連付けられている可能性があります。さらに、オフィス機器などは必ずしも部門に関連付ける必要はありません-チームや組織に関連付けることができます。
これのモデル化に関しては、2つのアイデアがあります。
最初のアイデアは、以下のような階層テーブルを持つことです:

階層
hierarchy_id(INT、NOT NULL)
parent_hierarchy_id(INT、NOT NULL)
organization_id(INT、NULL)
department_id(INT、NULL)
team_id(INT、NULL)
office_equipment(INT、NULL)

上の表では、各列は、それらの適切な表への外部キー参照を持つNULL可能フィールドです。すべての行から1つの列だけが入力されるという考え方になります。
私の2番目のアイデアは、以下のような単一のテーブルを持つことです。

階層
hierarchy_id(INT、NOT NULL)
parent_hierarchy_id(INT、NOT NULL)
タイプ(INT、NOT NULL)

この場合、上記のテーブルが階層構造を管理し、各「ノードテーブル」はhierarchy_idを持ち、これは階層テーブルへの外部キー参照を持ちます(つまり、組織にはhierachy_id列があります)。タイプ列は、どのタイプのノードが表示されているかを表すルックアップになります(つまり、組織、従業員など)。
どちらのアプローチにも長所と短所があります。
追加情報:

このテーブルの保守性を覚えておきたいのですが、追加、削除、変更などがあります。
このデータをユーザーインターフェイスに表示する必要があります。ユーザーインターフェイスには、ノードの種類と名前を表すアイコンが表示されるだけです。
さまざまなデータ要求に対して、ツリー全体でいくつかの集計を実行する必要があります。
この構造は、MySQLデータベースによってサポートされます。

誰かが同様のシナリオの経験がありますか?このアプローチに関する情報とガイダンスをかなり検索しましたが、情報を見つけることができませんでした。私が探しているものには、使用できなかった特定の用語があると感じています。
コミュニティの助けを前もってありがとう。
答え
「ネストされたセット」を調べたい場合があります。これは、「左」と「右」と呼ばれる2つの制限によって順序付けられたセットのサブセットを表すためのモデルです。このモデルでは、(6,7)は(5,10)のサブセットです。ネストされたセットを、階層用に別のテーブルを作成する設計と一緒に使用すると、階層テーブルには、leftID、rightID、ObjectID(FK)、およびlevelという4つの列ができます。

ウィキペディアにネストされたセットモデルの適切な説明があり、clicking hereで表示できます。
関連記事

mysql - スケジュールに基づいてデータを取得する

php - 別のフィールドに基づいてフィールドの出現回数をカウントする

mysql - SQL-AND演算子を使用して複数のWHERE値を照会する方法

mysql - 自動インクリメントのMySQL更新コマンド[重複]

mysql - 縮小との照合を使用する場合のMySQL文字列プレフィックスの一致

mysql - MySQLInstallerConsole.exeとchaning datadirを使用したMYSQL 5.6.21のインストール

php - PHPを使用して複数のリストボックス値がMySQLデータベースに挿入されない

php - as3はPDOを使用してPHPにデータを送信します

php - 前のクエリの値を使用してより多くの結果を取得する

php - php mysql jQueryによる連鎖選択