3

GAE の DAO レイヤーに Objectify を使用しています。エンティティのほとんどをソフト削除可能にしたいのですが、これらのエンティティを isActive ブール値で親を拡張するのは良い考えですか、それとも埋め込みを使用する必要がありますか、それとも単に作成する必要がありますか?インターフェイスはSoftDeleteableですか?

私が尋ねている理由は、Objectify が同じエンティティの種類に同じ親クラスを持つエンティティを格納しているように見え (少なくとも _ah/admin で見たものから)、すべてが同じエンティティの種類の下にある場合、クエリが遅くなる可能性があるためです。

どちらが最善の方法ですか、または GAE でソフト削除を行うためのより良い方法がある場合は?

アドバイスをお願いします。事前に感謝します!

4

2 に答える 2

5

この質問に対する唯一の正解はありません。最適なソリューションは、主に、特定の時点でエンティティの何パーセントが削除された状態になる可能性があるかによって異なります。

1 つのオプションは、次のようなフィールドを保存し、@Index(IfTrue.class) boolean active;このフィルターをすべてのクエリに追加することです。

ofy.load().type(Thing.class).filter("size >", 20).filter("active", true)

これの欠点は、追加のインデックスを追加する必要があることです。単一プロパティのインデックスで十分だった複数プロパティのインデックスが必要になる可能性があるため、おそらく複数のインデックスを追加する必要があります。

または、「削除済み」フラグを保存して、削除済みエンティティをクエリ結果から手動で除外することもできます。維持するインデックスは少なくなりますが、不要なレコードを引き戻すため、各クエリに余分なオーバーヘッドが追加されます。削除されたエントリがまばらである場合、これは問題になりません。

最後のトリック。おそらく最も便利なので、削除された日付をインデックスに保存するのが最善だと思うかもしれません。 @Index Date deleted; これによりfilter("deleted", null)、アクティブなアイテムを取得したり、日付スタンプでフィルター処理して、削除したい古いエンティティを取得したりできます。ただし、これにより、削除された日付がマルチプロパティ インデックスにインデックス化されるため、削除されたエンティティの割合が高い場合はインデックス サイズが大幅に増加する可能性があることに注意してください。この場合、@Index(IfNull.class) Date deleted;map-reduce を使用して、十分に古いエンティティを消去することができます。

于 2012-04-24T16:19:18.700 に答える
1

StickFigureの答えに同意します。「空の」インデックスと「null」のインデックスの違いを利用します。トレードオフは、各書き込みでより多くのデータストア書き込み操作が発生することです。インデックスを追加すると、その値を更新するたびに少なくとも 2 つの追加の書き込み操作 (昇順および降順) インデックスが必要になります。インデックスを削除すると、さらに 2 回の書き込みになります。個人的には、これは一見の価値があると思います。

エンティティの種類の単一のプロパティに対してクエリを実行するときはいつでも、クエリ時間はかなり予測可能である必要があります。これは、裏で何が起こっているかを考えると、エンティティの並列バッチ取得を実行する前に、アイテムのリストを順番に参照しているためです。データ。

于 2012-04-24T19:07:57.470 に答える