よって、SQLは以下のようになる。0※$1は追加先のノードのid、$2は追加するノードのidnode_sibling_relationships最後に、node_sibling_relationshipsテーブルにデータを挿入する。ルートに追加する場合はルートの末っ子、追加先のノードがある場合は追加先のノードの子の末っ子を親として追加すればよい。具体的には、3のノードを追加する場合は2のノードを、1-3のノードを追加する場合は1-2のノードを親として追加する。ルートの末っ子のidを取得するSQLは以下のようになる。sibling_leaves.id追加先のノードの子の末っ子のidを取得するSQLは以下のようになる。sibling_leaves.id※$1は追加先のノードのidこれらで取得したidのノードを親として追加するSQLは以下のようになる。0※$1は取得したid、$2は追加するノードのid削除nodes任意のノードを削除する場合は、そのノードの子孫もすべて削除する必要がある。よって、SQLは以下のようになる。CASCADEを設定しているので自動的に削除される。CASCADEを設定しているので自動的に削除される。長男でも末っ子でもない間のノードを削除する場合は、削除する前に、移動するノードの先祖(自身を除く)と移動するノードの子孫(自身を除く)間のweightをデクリメントする必要がある。よって、削除する前に以下のSQLを実行する必要がある。以下の移動先の指定方法のどれかを指定すれば、どの場所にも移動できる。ルート親のノード兄のノード弟のノードnode_relationshipsどの指定方法でも、まずは移動するノードのサブツリーを先祖から外す必要がある。以下のような木構造がある場合、11-11-1-1node_relationshipsテーブルは以下のようになる。ancestorは「移動するノード」以外の「移動するノード」の先祖で、descendantは移動するノードの子孫、の関係を削除すればよい。よって、SQLは以下のようになる。)※$1は任意のノードのid次に、外したサブツリーを、移動先のノードを親として追加する。先ほど外した1-1のサブツリーを、1-2のノードを親として追加する場合を考える。追加前は以下のようになる。0追加後は以下のようになる。追加する関係は、ancestorは移動先のノードの先祖、descendantは移動するノードの子孫になる。weightに関しては、例えば1のノードと1-1-1のノード間を考える。これを並べると、1-1-2-1-1-1-1-1になる。1-1-2間の重みは1、1-1-1-1-1間の重みは1、1-2-1-1間の重みは1である。追加する関係のweightは以下のようになる。1(移動先のノードと移動するノードとの重み)よって、SQLは以下のようになる。$2※$1は移動先のノードのid、$2は移動するノードのid移動先の指定方法で、ルートの場合は、移動先の親はないので実行しない。兄のノードと弟のノードの場合は、移動先の親はそれぞれの親のノードになる。node_sibling_relationshipsどの指定方法でも、まずは移動するノードを先祖と子孫から外す必要がある。以下のような木構造がある場合、123node_sibling_relationshipsテーブルは以下のようになる。ancestorは移動するノードの先祖で、descendantは移動するノードの子孫、の関係を削除すればよい(ただし、移動するノード自身との関係は除く)。よって、SQLは以下のようになる。descendant※$1は任意のノードのidそのまま削除すると1-3間のweightが2のままになってしまうので、削除する前に、移動するノードの先祖(自身を除く)と移動するノードの子孫(自身を除く)間のweightをデクリメントする必要がある。よって、削除する前に以下のSQLを実行する必要がある。)※$1は任意のノードのid次に、外したノードを、移動先のノードを親として追加する。追加する方法は、以下の3つのパターンに分けられる。ルート、親のノード兄のノード弟のノードルートの場合はルートの末っ子を、親のノードの場合は親のノードの子の末っ子を親として追加することにする。追加先のノードを取得した後は、以下のSQLで追加する。$1※$1は追加先のノードのid、$2は追加するノードのid次は、兄のノードの場合を考える。以下のような木構造がある場合、123node_sibling_relationshipsテーブルは以下のようになる。01-1のノードを、2のノードを兄として移動した場合は以下のようになる。ノードの移動機能と、ノードの追加機能の違いは、途中に割り込ませるところである。1)の関係を追加する部分である。これは追加先のノード(自身を除く)の子孫である。よって、SQLは以下のようになる。$1※$1は移動先のノードのid、$2は移動するノードのid弟のノードの場合は、これを逆にしたようなSQLになる。$1※$1は移動先のノードのid、$2は移動するノードのid追加後は、先ほどのデクリメントの処理のインクリメント版の処理を行う必要がある。)※$1は任意のノードのid最後にこの方法で、Notionアプリのページ機能の一部を実装した。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。