2016-07-04 14 views
0

質問、類似、およびハッシュタグのエンティティがあります。また、LikeエンティティとQuestionエンティティの間には1対多の関係があります。私はGoogleのクラウドエンドポイントを使用しており、私の問題はここから始まります。私のリストメソッドでは、私はjsonとして20の質問を返します。しかし、質問の各質問オブジェクトについては、ユーザーが既に質問を好きであるかどうかをチェックし、質問に属する関連するハッシュタグも取得する必要があります。どのように私はキーだけバッチクエリで同じ操作を行うことができます。そうでない場合は、各オブジェクトに対してオブジェクト化されたアイテムのリストをロードする

ofy().load().type(Like.class) 
       .filter("questionRef =", questionKey) 
       .filter("accountRef =", accountKey).first().now(); 

を実行します。エンティティ

@Entity 
@Cache 
public class Like { 

    @Id 
    @Getter 
    protected Long id; 

    @Index 
    @Load 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    private Ref<Account> accountRef; 

    @Index 
    @Load 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    private Ref<Question> questionRef; 

    @Index 
    @Getter 
    protected Date createdAt; 

    Like() { 
    } 

    Like(Key<Account> accountKey) { 
    this.accountRef = Ref.create(accountKey); 
    this.createdAt = new Date(); 
    } 
} 

ハッシュタグエンティティ

@Entity 
@Cache 
public class Hashtag implements Model<Hashtag> { 

    @Id 
    @Getter 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    private Long id; 

    @Index 
    @Load 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    private Ref<Question> questionRef; 

    @Index 
    @Getter 
    @Setter 
    private String text; 

    private Hashtag() { 
    } 

    private Hashtag(Builder builder) { 
    this.questionRef = builder.questionRef; 
    this.text = builder.text; 
    } 
} 

答えて

3

この質問へのいくつかの部分があります。

最初に、ハッシュタグ:質問にハッシュタグをインデックス付きリストプロパティとして保存するだけです。簡単です。

第2に、好きなこと:これを効率的に行うには、いくつかの方法があります。

「アカウント:質問」という自然なキー(文字列化されたウェブセーフキーを使用)を使用して、類似エンティティを作成することが1つです。このようにして、すべての{user、question}タプルのバッチをキーで取得できます。いくつかは不在、いくつかは存在するでしょう。あなたがたった20問、特にあなたが@Cacheのような場合には、合理的に効率的です。

もう1つは、ユーザーのすべての好きなものを追跡し、毎回それらを読み込む別のRelation Index Entityを作成することです。 5k項目を任意のリストプロパティに入れることができます。つまり、ユーザーが5k個を超えるものを好きなときに複数の項目を扱う必要があります。ただし、1つの祖先クエリでそれらをすべてロードするのは簡単です。 RIEは、ユーザーが@Parentにする必要があります。

別途メモ - フィールドthingRefを呼び出しないでください。単なるthingです。データベース内のデータは単なるキーに過ぎません。 Ref<?>Key<?>、およびネイティブの下位レベルKeyを交換できます。タイプ情報はデータベース名に属しません。

+0

ありがとうございました。私はRIEで行くつもりです。私はリストのプロパティのために@Indexを使う?そして、おそらく5kの制限を超えてしまうので、私はタスクキューを持つ新しいエンティティを追加しなければならないと思います。 – krialix

0

同様

私はあなたのエンティティの構造を変更することができるかどうかわかりません。答えが「いいえ」の場合、あなたが取ったアプローチ以外の選択肢はありません。

はいの場合は、QuestionLikeHashtagの情報も含めるように構成することをおすすめします。

@Entity 
public class Question { 
    @Id 
    private long id; 
    private Set<Key<Account>> likedBy; 
    private List<String> hashtags; 
} 

質問の場合、1つのクエリですべての情報を取得できます。そして、すべてのAccountのキーを収集し、以下のようにキーを使用して、質問を気に入っているすべての人々を取得するために別のデータストアクエリを行います。

Map<Key<Account>, Account> likedByAccounts = ofy().load().keys(accountKeys); 
+0

これは、特定の質問が好きなユーザーの数が制限されていないため、ほぼ確実に悪い考えです。 – stickfigure

関連する問題