Google AppEngineのアプリ、特にデータストアに問題があります。話は少し長いです。私のデータモデルは次のようになります。
- ユーザーはエンティティを作成できます。各エンティティには次のプロパティがあります:#1)。自動生成されたキー。#2)。クリエイター。#3)。数。
- アプリでは、次のクエリを実行しています。a)。作成者によるエンティティのクエリ(#2)。b)。numberプロパティ(#3)でエンティティをクエリします。c)。id(#1)でエンティティを照会します。
低レベルのデータストアAPIを使用しています。さて、これが私が試したいくつかの問題のあるアプローチです:
[アプローチ1]:データストアでは、エンティティを親なし(祖先なし)にすると、問題はありません。特に、クエリ「c」はDatastore.get(k)で簡単に実行できます。
アプローチ1の問題:データストアは「結果整合性」があるため、クエリ「a」の場合、結果は常に最新の状態に更新されません。ユーザーがエンティティを作成してから、作成したすべてのエンティティを一覧表示すると、新しく作成されたエンティティは常に欠落します。数秒後に更新するだけで表示されます...memcacheを使用してみましたが、問題は解決しません(または、適切な方法が見つかりませんか?)。
上記の問題を解決するために、データ構造を変更しました。[アプローチ2]:各エンティティを作成するときに、作成者に基づいてキーを作成し、新しいエンティティをキーの子として配置します。したがって、ユーザーによって作成されたすべてのエンティティは、祖先を持つエンティティです。したがって、クエリ'a'はタイムリーに機能し、クエリ'b'も機能しているようです。
アプローチ2の新しい問題:クエリ'c'の場合、常に何も返されません。これが私のクエリ「c」です。それらの両方は、常にエンティティを見つけることができません:
メソッド1:
エンティティen = datastore.get(k)
方法2:
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query(kind)
.setFilter(FilterOperator.EQUAL.of(Entity.KEY_RESERVED_PROPERTY, k));
Entity en = ds.prepare(q).asSingleEntity();
別の試み:アプローチ3:すべてのエンティティを1つの祖先の下にグループ化します。これにより、Approach1の問題が解決され、祖先フィルターを使用してクエリを実行できるため、結果を取得できます。
アプローチ3の問題:このような構造は、すべてのエンティティを1つのエンティティグループとしてグループ化します。Googleデータストアの仕様によると、書き込み操作は最大で1秒間に5回発生する可能性があります。これは私が打ちたくない限界です...
この種のデータモデルは本当に一般的だと思います。データを構造化する適切な方法はありますか?どんな助けでも大歓迎です。ありがとう...