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

大きなツリーを持つmysql階層ストレージ

    ツリーを頻繁に更新する必要がある場合、入れ子集合の設計は間違いなく困難です。ツリーの大部分の番号を付け直す必要があります。

    これを軽減するための1つの提案は、整数の代わりに浮動小数点数を使用することです。ツリーに新しいノードを挿入すると、新しいノードの親のネストされたセット番号の間にいくつかのFLOAT番号を見つけるのは比較的簡単です。最終的には浮動小数点数の精度の限界に達する可能性がありますが、ツリーはそれほど深くないため、長い間発生することはありません。

    私が書いたもう1つのテクニックは、クロージャーテーブルと呼ばれます。 。階層を格納するこの方法により、ツリーの多くを更新しなくても、大きなツリーにノードを挿入/更新/削除することがはるかに簡単になります。また、単一の非再帰SQLクエリでツリー全体または任意のサブツリーをクエリできます。

    クロージャーテーブルの詳細については、以下を参照してください:

    コメントを再確認してください:

    隣接リストは単純で、冗長性が最小限であり、入れ子集合ではサポートされていないFK関係をサポートします。 再帰クエリを使用する場合、隣接リストは任意の深さのツリー全体のクエリをサポートします 。ただし、MySQLは再帰クエリをサポートしていません。

    直接の親子関係(つまり、1レベルの深さ)のみをクエリする必要がある場合、または固定の深さのツリーのみをクエリする必要がある場合は、隣接リストで問題ありません。



    1. JSONデータ型のレコードのネストされた配列とのクエリの組み合わせ

    2. 複数のテーブルへの外部キー

    3. SQLite-データを削除

    4. T-SQLを使用してSQLServerでリンクされたサーバーのリストを返す2つの方法