SQLで階層情報を操作しやすくするためのいくつかの選択肢があります。
-
一般的なテーブル式 (SQL-2003標準による)使用しているデータの親IDタイプに対する再帰SQLクエリをサポートします。これまでのところ、MySQLはこの機能をサポートしていません。 PostgreSQL 8.4、Microsoft SQL Server、およびIBM DB2は、CTE構文をサポートするRDBMSブランドの例です。 Oracleには、再帰クエリをサポートするSQL構文の独自の拡張機能もあります。
-
入れ子集合 (@phantombrainが言及している左/右のソリューション)は、JoeCelkoの著書「SQLforSmartiesのツリーと階層」、およびインターネット上の多数の記事やブログ投稿で詳しく説明されているソリューションです。
-
パスの列挙 (別名マテリアライズドパス)は、階層内の各行に文字列を格納して、その行の祖先のパスを記録します。これを
LIKE
と組み合わせる パス文字列をその祖先のパスおよび子孫のパスと比較するためのクエリ。 -
クロージャーテーブル (別名推移閉包関係)は、使用している設計のように直接の親だけでなく、すべての祖先と子孫の関係を格納するために2番目のテーブルを使用します。すべてのパスを保存すると、多くの種類のクエリが簡単になります。
-
ハイブリッドソリューション も存在します。たとえば、実行中の直接の親IDだけでなく、ツリーのルートも保存します。これで、同じ階層内の他のすべての行を取得し、それらをアプリケーションコードにフェッチして、従来のデータ構造でツリーを分類できます。