0

SQL以外のデータベースに非常に大きな要素のリストがあります。

すべての要素には、1からNまでの並べ替え順序があります。この並べ替え順序は、結果がフォームにどのように表示されるかを指定します。

UIで順序の変更がトリガーされると(要素iを位置jに配置)、その間のすべてのエンティティを更新する必要があります。要素1が最後になる場合は、N回更新する必要があります。

この操作のコストを下げる効率的な方法はありますか?ソート値にインデックスを付けるスマートな方法はありますか?

いくつかの考慮事項:

  • よりスマートなソリューションでエンティティのインデックスを再作成できるように、アプリケーションを再設計しています。
  • 書き込み(更新)のコストは、フェッチ(1つのエンティティの読み取り)の+-4倍です。
  • リストは大きく、メモリに収まりません。
4

4 に答える 4

2
  1. エンティティのインデックスを再作成します。orderプロパティをdoubleに設定します。
  2. ユーザーがエンティティを新しい位置に移動するたびに、他の2つのエンティティ間に新しい注文プロパティを割り当てます。

    entityA.setOrder((entityB.getOrder()+ entityC.getOrder())/ 2);

  3. エンティティAを保存します(プロパティ「順序」にインデックスを付ける必要があります)。

  4. ユーザーが10000から10200までのエンティティをリクエストする場合、並べ替え順序を使用してorderプロパティにクエリを作成します。10000から10200までの結果を取得します。

    datastore.prepare(q).asList(FetchOptions.Builder.withOffset(10000).limit(200));

  5. エンティティのインデックスを再度作成しないでください。データストアは、エンティティを保存するたびにそれを行います。

于 2012-09-25T22:20:11.917 に答える
1

エンティティをGAEデータストアに保存し、データストアにエンティティのインデックスを作成させることを前提としています。データストアはインデックスのようなリンクリストを使用しますが、リンクリストにアクセスすることはできません。

完璧なメカニズムはないと思いますが、N個のアイテムを1..Nから並べ替える代わりに、大量のまばらな数値のセットを使用し(たとえば、浮動小数点数を使用)、その範囲全体にエンティティを均等に分散します。アイテムを並べ替えるときはいつでも、2つの新しいネイバーの間に存在する新しいインデックス値を生成するだけです。

ネイバーが近すぎるという最悪のシナリオに遭遇した場合は、ネイバーの新しいインデックスを生成します。より高度なシステムでは、再ソートのたびにエンティティ間に最小限のスペースが確保され、いくつかの追加のネイバーのインデックスが事前に再作成される場合があります。

于 2012-09-26T01:48:23.743 に答える
-1

私の意見では、あなたの現在のモデルには他の選択肢はありません。インデックス付きのコレクションと同様に、要素を移動するときに要素を「再インデックス」する必要があります。コレクションの一部をデクリメントまたはインクリメントします。

モデルを変更することは、要件の解決策になる可能性があります。削除/移動/挿入操作が「安価」であるリンクリストのように設計することを試みることができます。すべての要素は、次の(単純な)要素または次の要素と前の要素(二重)を知っています

于 2012-09-25T21:03:17.807 に答える
-2

並べ替え順序とUIデータを、各エンティティの他のかさばるデータから分離できます。後者は変更しないでおくことができます。

うーん、あなたがこれを持っているなら:

entitles = [bigdata1, bigdata2, bigdata3, ...]
order_numbers = [2, 3, 1, ...]

order_numbersは、ソートまたは任意のユーザー定義値の結果にすることができます。

その後、あなたは持っています

display_order = [2, 0, 1, ...]

bigdata3が最初に表示されることを意味します。UIがとにかく注文を変更したい場合は、order_numbersとdisplay_orderのみを変更する必要があり、資格は必要ありません。これが私の理解です。

于 2012-09-25T21:24:27.067 に答える