2011-08-15 6 views
0

アプリケーションをM/SデータストアからHRDに移行する際、避けるべき落とし穴があります。私は、「同じ種類のエンティティIDは必ずしも一意ではない」というような特定の分野について質問をしました。アプリケーションをGAE M/SデータストアからHRDに移動することの影響

これをさらに説明すると、例があります。

  1. 使用 com.google.appengine.api.datastore.Key
  2. 住所実体参照の顧客として顧客キーを使用して、私は3つのエンティティ顧客を持っている連絡先、
  3. 下記の連絡先エンティティ参照顧客のアドレスを言うことができます限り、顧客キー

3クラスは次のとおりです。

public class Customer { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 

    @Persistent 
    private String name; 
} 

public class Contact { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 

    @Persistent 
    private String name; 

    @Persistent 
    private Key customerId; 
} 


public class Address { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key id; 

    @Persistent 
    private String address; 

    @Persistent 
    private Long customerId; 
} 

すべてのエンティティがルートエンティティです。

連絡先と住所のエンティティでのcustomerIdに移行すると、彼らはまだ動作しますか、または移行する前に特別なことをする必要がありますか?

ありがとうございます!

答えて

1

あなたが指しているのは、キーの作り方です。

  • あなたのアプリケーションID
  • 現在の名前空間
  • 親の階層(S)<-- this allows ids to be non-unique within a kind
  • 種類名
  • key_name OR id
  • 与えられた:エンティティのキ​​ーから作られます

キーが一意になるためには、これらの部分のいずれかが変更される可能性があります。アプリ内の1つの名前空間内で1つの種類の中で、唯一のIDの時間は、そのエンティティにparentを設定した場合です。

これは、すべてのルートエンティティが定義されていることを意味します。は、固有のID /名前を持ちます。

祖先階層を持つエンティティであっても、割り当てられたIDが一種の内で一意であることを保証する必要がある場合は、そうすることができます。

  1. デザインを再考してください。あなたが/必要とする親を持たないエンティティグループaccross IDでエンティティを参照している場合は、どこかに彼らが必要とされなかったエンティティグループを適用している場合があります
  2. あなたがallocateIds手動種類
+0

感謝のルートバージョンに基づいて可能性があり詳細な説明は、すべてのエンティティがルートエンティティであるため、重複したキーを心配することなく、pm.newQuery(、 "where customerId = ")をHRDと引き続き使用できます。その裏返しは最終的な一貫性になります。 HRD全体にデータが表示されるには2〜5秒かかりますか? – Paul

+0

id(したがってキー)でエンティティを直接取得することは常に強固に行われ、最終的な一貫性は複数のエンティティグループにわたってクエリを実行しているときにのみ表示されます。 –