1

Google AppEngineのアプリ、特にデータストアに問題があります。話は少し長いです。私のデータモデルは次のようになります。

  1. ユーザーはエンティティを作成できます。各エンティティには次のプロパティがあります:#1)。自動生成されたキー。#2)。クリエイター。#3)。数。
  2. アプリでは、次のクエリを実行しています。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回発生する可能性があります。これは私が打ちたくない限界です...

この種のデータモデルは本当に一般的だと思います。データを構造化する適切な方法はありますか?どんな助けでも大歓迎です。ありがとう...

4

1 に答える 1

1

質問の形式のため、何を求めているのかよくわかりませんが...

ID でクエリを実行する場合は、親キーも含める必要があります。キーには親データと子データの両方が含まれます。子データのみを使用している場合、それは「名前」ではないため、探しているものは返されません。フル パス (祖先/子) はその名前です。

したがって、作成しているキーに親を含めてから取得してください。

key = parent, parent_ID, child, child_ID

なので

key = child, ID

キーが不完全であり、そのように必要なデータを返すことができないため、親がある場合は機能しません。

于 2012-10-05T13:41:38.297 に答える