1

私はある種の実体を持っています、そして私は古いものを捨てることによってそれらを限られた量の範囲内に保つ必要があります。ログエントリのメンテナンスと同じように。これを行うためのGAEの良いアプローチはありますか?

私の心のオプション:

オプション1.これらのエンティティごとにDateプロパティを追加します。データストア統計を毎日チェックするcronジョブを作成します。制限を超えている場合は、その種類のエンティティをクエリし、日付で最も古いものから順に並べ替えます。サイズがたとえば0.9*max_limitより小さくなるまで、それらを削除します。

オプション2。オプション1には、インデックス付きの追加のプロパティが必要です。エンティティキーID増加する可能性があることを確認しました。そこで、キーのみを照会し、昇順で並べ替えたいと思います。IDが小さいものを削除します。追加のプロパティ(日付)とインデックスは必要ありません。しかし、私はキーIDがますます確実になるかどうかを真剣に心配していますか?

これは一般的なデータ保守タスクだと思います。それを行うための成熟した方法はありますか?

ちなみに、私のアプリの小さな広告は、無料で純粋にコーダーの楽しみのためです!http://robotypo.appspot.com

4

2 に答える 2

1

IDが常に増加しているとは限りません。ID genに関するドキュメントは、次のことのみを保証します。

この方法で割り当てられたIDは、データストアの自動IDシーケンスジェネレーターによって使用されず、競合することなくエンティティキーで使用できます。

デフォルトのソート順も、ID番号でソートされることが保証されていません。

並べ替え順序が指定されていない場合、結果はデー​​タストアから取得された順序で返されます。

これはあいまいで、デフォルトの順序がIDによるものであるとは言いません。


1つの解決策は、最初の要素を追跡する回転カウンターを使用することです。新しいエンティティを追加する場合:カウンターをフェッチしてインクリメントし、制限で変更し、カウンターの値としてIDを持つ新しい要素を追加します。カウンターが別のリクエストによってインクリメントされないことを保証するために、これはすべてトランザクションで実行する必要があります。同じキーを持つ新しい要素は、存在していた要素を上書きします。

それらをすべてフェッチする場合は、手動でキーを生成し(すべて既知であるため)、一括フェッチを実行し、IDで並べ替えてから、カウンターの値で2つの部分に分割し、それらを交換します。


IDを一意にしたい場合は、別のカウンターを維持し(トランザクションを使用して変更し、安全を確保するために読み取ります)、IDを値として持つエンティティを作成し、制限に達したときにIDを削除します。

于 2012-11-08T08:46:00.357 に答える
1

次のように、制限するエンティティのキ​​ーのリストを保持する2番目のエンティティ(これをAと呼びます)を作成できます(擬似コード)。

class A:
    List<Key> limitedEntities;

新しいエンティティを追加するときは、そのキーをAのリストに追加します。リストの長さが制限を超える場合は、リストの最初の要素を取得して、対応するエンティティを削除します。

エンティティを追加または削除するときは、トランザクション内のエンティティAのリストを変更する必要があることに注意してください。これらのエンティティは異なるエンティティグループに属しているため、クロスグループトランザクションの使用を検討する必要があります。

お役に立てれば!

于 2012-11-08T16:31:34.383 に答える