sql >> データベース >  >> RDS >> Mysql

効果的かつ簡単な方法で階層、親子関係を達成する

    残念ながら、データモデルを変更できず、MySQLを使用している場合は、再帰クエリが必要であり、再帰クエリをサポートしていないDBMSを使用している状況に陥っています。

    Quassnoiは、階層データをクエリするための手法を示す、興味深い一連のブログ記事を作成しました。彼のソリューションは非常に巧妙ですが、非常に複雑です。 http:// Explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

    PostgreSQLは別のオープンソースRDBMSであり、再帰クエリをサポートします 、表示した方法で保存されたツリー全体をフェッチできます。ただし、データモデルを変更できない場合は、別のRDBMSに切り替えることはできないと思います。

    任意の深さのツリーを簡単に取得できるようにする代替データモデルがいくつかあります。

    • クロージャーテーブル
    • 入れ子集合、別名変更されたプレオーダーツリートラバーサル
    • パスの列挙、別名マテリアライズドパス

    これらについては、プレゼンテーションSQLとPHPを使用した階層データのモデル> 、および私の本では、 SQLアンチパターン:データベースプログラミングの落とし穴を回避する

    最後に、Slashdot のコードで使用されている別のソリューションがあります。 、コメント階層:隣接リストのように「parent_id」を格納しますが、「root_id」列も格納します。特定のツリーのすべてのメンバーは、そのツリーで最も高い祖先ノードであるroot_idに同じ値を持ちます。そうすれば、1つのクエリでツリー全体を簡単に取得できます。

    SELECT * FROM site WHERE root_id = 123;
    

    次に、アプリケーションはすべてのノードをデータベースから配列にフェッチします。この配列をループするコードを記述して、ノードをメモリ内のツリーデータ構造に挿入する必要があります。これは、多数の個別のツリーがあり、各ツリーのエントリが比較的少ない場合に適したソリューションです。スラッシュドットの場合に適しています。



    1. max_connectionsのようなパラメーター(postgresql.conf設定)を照会します

    2. SQLServerで外部キー制約のあるテーブルを作成する方法-SQLServer/TSQLチュートリアルパート66

    3. ClusterControl-高度なバックアップ管理-mariabackupパートIII

    4. パージしないことの価格