10

私は、ユーザーが投稿を行うことができますGoogle App Engineの(ジャワ)でアプリケーションを構築していると私はこれらの記事にタグを追加することで考えているので、私はこのようなものがあります:エンティティポストアプリケーションエンジンのデータストア:結合なしで投稿とタグを実装する方法は?

を:

エンティティタグで
public List<Key> tags; 

public List<Key> posts; 

例えば、照会することは容易で特定のタグを持つすべての記事が、どのように私はタグのリストを持っているすべてのポストを得ることができるでしょうか? 私は各タグのクエリを作成し、結果の交差を作ることができますが、もっと良い方法があるかもしれません。なぜなら、それは多くのポストで遅くなるからです。

さらに難しいかもしれない別のものは、ポストを持っている、一般的なタグの数によって順序付けられたタグを持つ投稿を得ることです、私は何とかこのような "類似の"投稿を得ることができます。

ジョインではこれははるかに簡単ですが、私はアプリエンジンを使い始めており、ジョインを置き換える良い方法について考えることはできません。

ありがとうございます!

答えて

5

このデザインでは、タグエンティティがボトルネックになる可能性があります。特に、一部のタグが非常に一般的であることが予想される場合は、 私が考えることができる3つの特定の問題は、あなたの獲得と投入の効率、競合の書き込みとインデックスの爆発です。例のためにstackoverflowを見てみましょう - 今すぐ "java"とタグ付けされた14,000の投稿があります。

  1. つまり、Javaタグエンティティを取得する必要があるたびに、データストアから14kの価値のあるデータを取り戻しています。あなたが置くときにあなたはそれをすべて送り返しています。多くのバイトを追加する可能性があります。
  2. 前後のバイトに加えて、各putにはインデックスを更新する必要があります。 ListPropertyの各エントリは別のインデックスエントリにマップされます。今ではたくさんのインデックス更新をしています。これは数字3につながります...
  3. 爆発的なインデックス。各エンティティには、インデックスエントリの数に制限があります。私はエンティティごとに5000という制限があると思う。実際に同じタグを持つことができる投稿の数には厳しい制限があります。

参考資料:大きなリスト

  • Exploding indexes

  • 良いニュースがある、との問題のいくつかの

    • このpostタッチあなたの要件の一部だろうPostエンティティだけで簡単に処理できます。 たとえば、あなたは簡単にこのようなクエリフィルタでタグのリストのすべてを持っているすべての記事を見つけることができます: JavaまたはAppEngineのいずれかのタグを持つすべての記事を

      Query q = pm.newQuery(Post.class) 
      q.setFilter("tags" == 'Java' && "tags == 'appengine'"); 
      

      を、あなたが必要になりますタグごとに1つのクエリを実行し、結果を自分で組み合わせます。データストアは、今すぐOR/IN型の操作を処理しません。

      関連記事を見つけるのは手間がかかります。私はいくつかのコーヒーの後でそれについて考えるでしょう。

    +1

    リストプロパティを持つエンティティを取得したときに、そのリスト内のすべてのエンティティも取得されていることはわかりませんでした...そうですか? リスト投稿を削除します。 私は、リストのプロパティでその方法でクエリを実行できることも知りませんでした。 q.setFilter( "tags" == 'Java' && "tags == 'appengine'"); これは本当に良いニュースです:) Thanks Peter。 – Damian

    +0

    エンティティをどのように実装するか、JDOまたはJPAを使用しているかどうか(JDOでのフェッチ・グループの読取りなど)に応じて、リスト内の完全なエンティティが取得される場合と取得されない場合がありますが、キーを前後に動かしていると、数千のキーが加算されます。 –

    1

    Google IOからこのビデオをチェックしてください。関係インデックスエンティティは必要なもので、TagエンティティのList<Key> postsを削除できます。 PostエンティティのList<Key> tagsと同様です。

    1

    @ topchefさんのブログ記事はEfficient Keyword Search with Relation Index Entities and Objectify for Google Datastoreです。 Relation Index EntitiesとObjectifyを使用してリストプロパティで検索を実装する方法について説明します。

    +0

    これは私の質問に対する彼の答えでした。http://stackoverflow.com/questions/5778606/how-do-you-use-list-properties-in-google-app-engine-datastore-in-java – onejigtwojig

    関連する問題