NHibernate を使用して、さまざまなタイプのオブジェクトの大きなツリーをロードしています。マッピングは、table-per-subclass 戦略を使用して実装されます。少数のフィールド (NodeId、ParentId、NodeType) と、Node から継承して独自のフィールドを追加するいくつかのサブクラスのみを持つ基本クラス「Node」を定義しました。
このアプローチの実装は簡単で、パフォーマンスについて文句を言うことはできません。異なるタイプの 10,000 個のオブジェクトの大きなツリーが、1 回のラウンドトリップを使用して数百ミリ秒以内に私の古いマシンに取り込まれます。ただし、気になる点が 1 つあります。このような戦略では、ノード テーブルが、定義されたサブクラスに対応する他のすべてのテーブルと外部結合される複雑なクエリが生成されます。異なるサブクラスの数が少ない場合はこれで問題ありませんが、数が増えると OUTER JOIN の複雑さも増します。
クラスごとにテーブルを定義することは洗練されたオプションではないようで、基本クラスからデータを選択するときに動作が遅くなります (UNION のため)。他のオプションでは、データベース サーバーへの往復回数が増えるようです。
では、さまざまな種類のエンティティで構成される大規模なツリーを作成する場合のベスト プラクティスは何だと思いますか? サブクラスごとのテーブルよりも優れたものはありますか?