フラットな階層データストレージ

コメントツリーを保存する例について。



多くの人は、コメントを保存するという問題に直面したと思われます。少なくともそれについて考えました。 明らかな「額」の解決策は、親コメントへのリンクであり、その結果、必要に応じてツリーを表示するための再帰呼び出しです。 最新のDBMSは階層クエリをサポートしますが、これは問題を範囲外に転送するだけであるように思えますが、おそらく間違っています。 いずれにせよ、私はGoogle Application Engineについて書いたが、階層クエリについてはまったく話していない。



再帰の見込みとデータベースへの多数の小さなクエリが本当に好きではなかったので、1つの単純なクエリですべてのコメントを取得する方法を発明し始めました。 そして、私はすぐにそのような方法を「発明」しました。 私は何人かの友人にインタビューしましたが、このトピックについて考えている人はほとんどいないことがわかったので、私が実現したことを自由に説明します。







そのため、主な要件は、1つのリクエストですべてのコメントを正しい順序で一度に取得することです。 したがって、1)表示順序2)ネストレベルを格納する必要があります。



最初の段落では、追加された時間に関係なく、最初のコメントへの回答を2番目のコメントの前に表示する必要があると述べています。



これらの2つの問題を解決するために、特定のフィールドを導入し、それによって並べ替えることでコメントの順序を変更することが提案されています。



以下は、ハッシュの例を含む小さなコメントツリーです。



000000 1

000100 1.1

000101 1.1.1 ...

000102 1.1.2 ...

000103 1.1.3 ...

000104 1.1.4 ...

000200 1.2

000300 1.3

010000 2

010100 2.1

010200 2.2 ...

020000 3









ここで、「1.1.x」のような数字はコメントの一部であり、古典的な「実体化されたパス」が示唆するハッシュの一部ではありません。



提案されたハッシュは、各行の先頭にあります。 この場合、ハッシュには3桁の2桁の数字が含まれます。最初の2桁にはゼロレベルのコメント、2秒の桁には2番目のコメントが続きます。 このフィールドの計算は写真から非常に明らかであるように思えます。



次の2つの制限が自動的に続きます。

1)各レベルのコメントの数は限られています

2)レベルの数は限られています。



コメントは、象徴的なハッシュに切り替えるときの2番目の制限の自明性がもうそれほど明白でないことを示唆します



実際、これらの制限の両方に目を留めることができると決めました。 コメントを保存する場合、コメントの数とネストはかなり制限される可能性があります。 さらに、ちょっとしたトリックを行って、4レベルにコメントを追加することを「許可」しましたが、実際には、3レベルのコメントとして作成し、それを表示します。 これは、2人の熱心なコメンテーターの議論を制限しないために行われました。



実装の詳細

この考えを発展させて、私はテキストフィールドを優先してデジタルフィールドを放棄することにしました。 この場合、効率が少し低下しますが、ハッシュの長さにまったく制限はありません。 数字の代わりに、AZとaxの記号を使用します。つまり、実際には50を基数とする数字を使用します(5進法)。



50の10進数システムでは、すぐに50のレコードに1桁で番号を付け、2つはすでに2500で、これは目的には十分です。 ネストレベル8を使用します。これらのパラメーターはどちらも簡単に変更できますが、使用を開始する前に一度だけ実行できます。



各レコードのハッシュを計算するために、そのネストレベルに加えて、別のレコードを追加するときに不要なリクエストを行う必要がないように、子レコードの数も保存します(実際、Googleデータストレージは選択カウント(*)を実行できません)



ハッシュの計算、または子レコードのカウンターの更新は、トランザクション内で実行する必要があります。 ハッシュ値は何にも依存しないため、コメント自体はトランザクションの範囲外で既に実行できます。



ところで、念のため、親要素へのリンクを保持します。 突然すべてを変更することに決めた場合-写真を復元するためのすべてのソースデータがあります。



結論

制限の存在によるわずかな不快感;

このサービス分野を計算する際のいくつかの困難;

サーバーに不必要な負荷をかけることなく、すべての結果を1つのフラットリクエストで即座に配信します。



私の意見では、これまたは階層データを保存する同様の方法を覚えておく価値があり、時にはそれは非常に適用可能であり、良い結果をもたらします。



たとえば、 ここでは、すべての外観と動作を確認できます。



PSそうそう、誰かがこの問題の解決策の古典的な名前や実装を教えてくれたら、それは素晴らしいことです。



All Articles