2012-04-24 16 views
3

GAEのDAOレイヤーにObjectifyを使用していますが、私のエンティティのほとんどをソフト削除可能にしたいのですが、これらのエンティティをisActiveブール値で親に拡張することをお勧めしますか?私は埋め込みを使用する必要がありますか、それともインターフェイスisSoftDeleteableにする必要がありますか?Google App Engine/Objectifyソフト削除

理由同じエンティティの種類(少なくとも_ah/adminに表示されているもの)と同じ親クラスのエンティティを格納することを目的としており、すべてが同じエンティティの下にあるときにクエリが遅くなる可能性があります種類、多分?

GAEでソフト削除するより良い方法はありますか?

事前にお知らせください!

+0

Datastoreは1つのみです。おそらく同じエンティティの種類を意味していました。 –

+0

はい...私は同じエンティティの種類を意味しました。おかげでPeterが修正を受けました –

答えて

5

この質問に対して1つの正解はありません。最適なソリューションは、主に、特定の時点で削除された状態になる可能性のあるエンティティの割合に依存します。

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

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

これの欠点は、余分なインデックスを追加する必要があることである - あなたは今、マルチプロパティが必要な場合がありますので、おそらくいくつかの単一のプロパティのインデックスが十分にあるインデックス。

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

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

+0

これは、すべてのEntityにブール値フィールドを追加し、抽象/親クラスを持たずにそれらのインデックスを作成し、すべてのEntityでそれを拡張する方が良いということですか? –

+0

削除可能な各クラスにブール値/日付フィールドを追加するか、削除可能な各クラスを削除可能にする(ブール値/日付を持つ)かどうかはかなり重要ではありません。ただし、「isa」Deletableをモデル化する魅力的な理由がない限り、これは過大な影響を与えるように思えます。また、単一継承の問題に遭遇するかもしれません。おそらく、Deletableインターフェースを使うほうが良いでしょう。 – stickfigure

1

私はStickFigureの答えに同意します。 「空の」インデックスと「ヌル」インデックスの違いを利用してください。ただし、インデックスを追加すると、その値を更新するたびに必要な2つ以上の追加の書き込み操作(昇順および降順)インデックスが必要になります。インデックスを削除すると、さらに2回の書き込みとなります。個人的には、これは価値があると思います。

エンティティの種類の1つのプロパティに対してクエリを実行すると、クエリ時間はかなり予測可能になるはずです。なぜなら、カバーの下に何が起きているのかを考えると、パラレルバッチを実行する前に、エンティティデータを取得する。

関連する問題