25

エンティティグループがGAEのストレージでどのように機能するかについてはすべて詳しく知っていますが、昨日(パロアルトで開催されたApp Engineのミートアップで)、プレゼンターがエンティティグループの使用について説明していたので、実際にそれらを使用したことがないことに気付きました。私自身のGAEアプリで、私が使用したオープンソースのGAEアプリでそれらが使用されているのを見たのを覚えていません。

ですから、私はそのような例を見落としている(気づいていない、覚えていない)のではないかと思います。なぜなら、「エンティティグループの使用」を「解決されているアプリケーションの問題の種類」にすぐに結び付けるのに十分に慣れていないからです。この目標を念頭に置いてこのようなソースを調査し、EGの使用が解決している問題(つまり、アプリがアプリで機能するのに、アプリが機能しない、または機能しない理由)に焦点を当てることで、改善する必要があると思います。

誰かがそのようなコードに良いURLを提案できますか?(エッセイは、アプリケーションレベルの問題解決に焦点を当てている場合も歓迎されますが、私が見たほとんどのように、EGがどのように機能するかの詳細に焦点を当てている場合はそうではありません!-)

4

3 に答える 3

23

エンティティグループの主な用途は、トランザクション内の複数のエンティティを更新する手段を提供することです。

それらを使用する必要がなかった場合は、あなたの祝福を数えてください。一貫性を保つために2つのエンティティを同時に更新する必要がないようにデータモデルを設計しているか、そうでなければ必要ですが幸運に恵まれています:)

InvoiceエンティティタイプとLineItemエンティティタイプがあると想像してください。1つの請求書に複数のLineItemを関連付けることができます。私の請求書エンティティには、LastUpdatedというフィールドがあります。LineItemが請求書に追加されるたびに、現在の日付をLastUpdatedフィールドに保存したいと思います。

私の更新関数は次のようになります(擬似コード)

invoice.lastUpdated = now()
lineitem = new lineitem()

invoice.put()
lineitem.put()

請求書のput()が成功し、明細のput()が失敗した場合はどうなりますか?請求書の日付には何かが更新されたことが示されますが、実際の更新(新しいLineItem)はありません。解決策は、両方のputs()をトランザクション内に配置することです。

別の解決策は、このデータをlastUpdatedフィールドに格納する代わりに、クエリを使用して最後に挿入されたLineItemの日付を見つけることです。ただし、これには、最後に広告申込情報が追加された時刻を知りたいときに、請求書とすべての広告申込情報の両方を取得する必要があり、貴重なデータストアの割り当てが必要になります。

ポスターのコメントに返信するために編集する

ああ。私はあなたの混乱を理解していると思います。上記の段落は、トランザクションが重要である理由を示しています。ただし、エンティティグループがトランザクションにどのように関連しているかがわからないため、エンティティグループについてはまだ気にしないと言います。ただし、db.run-in-transactionを使用している場合は、おそらく気付かないうちにエンティティグループを使用しています。すべてのトランザクションには1つのエンティティグループのみが含まれ、特定のトランザクションは同じグループに属するエンティティにのみ影響を与える可能性があります。ここを参照してください

「トランザクション内のすべてのデータストア操作は、同じエンティティグループ内のエンティティで操作する必要があります」。

取引ではどのようなことをしていますか?デフォルトで独自のエンティティグループにある1つのエンティティのみでトランザクションを使用する理由はたくさんあります。ただし、上記の例のように、2つ以上のエンティティの同期を維持する必要がある場合があります。InvoiceエンティティとLineItemエンティティが同じエンティティグループにない場合、それらへの変更をdb.run-in-transaction呼び出しでラップすることはできません。したがって、2つ以上のエンティティをトランザクションで操作する場合は、最初にそれらが同じグループにあることを確認する必要があります。それがなぜそれらが有用であるかをより明確にすることを願っています。

于 2009-07-09T17:08:06.357 に答える
2

ここで使用しました。顧客オブジェクトをマップマーカーの親として設定しています。これにより、顧客ごとにエンティティグループが作成され、次の2つの利点があります。

  1. 顧客のマーカーは顧客オブジェクトと一緒に物理的に保存されるため、顧客のマーカーの取得ははるかに高速です(同じサーバー上、おそらく同じディスク上)

  2. トランザクションで顧客のマーカーを変更できます。トランザクションが操作するすべてのオブジェクトが同じグループにある必要がある理由は、それらが同じ物理的な場所に格納されているためであり、データのロックを実装しやすくなっていると思います。

于 2009-07-10T08:12:12.473 に答える
1

私はこのシンプルなウィキシステムでそれらを使用しました。ページの最新バージョンは常にルートエンティティであり、過去のバージョンには最新バージョンが祖先として含まれています。コピー操作は、バージョンの一貫性を維持し、同時実行の場合にバージョンが失われないようにするために、トランザクションで実行されます。

于 2010-07-19T04:27:35.353 に答える