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

ツリー構造をリレーショナルDBに格納するための既知の方法は何ですか?

    いつものように:最善の解決策はありません。それぞれのソリューションは、さまざまなことを簡単または困難にします。適切な解決策は、最も実行する操作によって異なります。

    親IDを使用した単純なアプローチ:

    長所:

    • 実装が簡単

    • 大きなサブツリーを別の親に簡単に移動できます

    • インサートが安い

    • SQLで直接アクセスできる必要なフィールド

    短所:

    • ツリー全体の取得は再帰的であるため、コストがかかります

    • すべての親を見つけることもコストがかかります(SQLは再帰を認識しません...)

    変更されたプレオーダーツリートラバーサル(開始点と終了点を保存):

    長所:

    • ツリー全体を取得するのは簡単で安価です

    • すべての親を見つけるのは安いです

    • SQLで直接アクセスできる必要なフィールド

    • ボーナス:親ノード内の子ノードの順序も保存しています

    短所:

    • 多くのノードを更新する必要がある場合があるため、挿入/更新には非常にコストがかかる可能性があります

    各ノードにパスを保存する:

    長所:

    • すべての親を見つけるのは安いです

    • ツリー全体を取得するのは安価です

    • 挿入は安いです

    短所:

    • ツリー全体を移動するにはコストがかかります

    • パスを保存する方法によっては、SQLで直接操作することはできないため、パスを変更する場合は、常にパスをフェッチして解析する必要があります。

    クロージャーテーブル

    長所:

    • 実装が簡単

    • すべての親を見つけるのは安いです

    • 挿入は安いです

    • 木全体を取得するのは安価です

    短所:

    • 追加のテーブルが必要です

    • 他のアプローチと比較して多くのスペースを占有します

    • サブツリーの移動にはコストがかかります

    データが変更される頻度に応じて、最後の2つのうちの1つを選択します。

    参照: http://media.pragprog.com/titles/bksqla/trees pdf



    1. sqliteに記録するデータを挿入しています

    2. Ora-01427の単一行サブクエリがselectで複数の行を返す問題を修正するにはどうすればよいですか?

    3. SQL結合チュートリアル

    4. SQLiteデータベースに現在の日付と時刻を挿入する