10

私はGoogleAppEngine(Java)でアプリケーションを構築しており、ユーザーは投稿を行うことができ、これらの投稿にタグを追加することを考えているので、次のようになります。

エンティティ投稿:

public List<Key> tags;

エンティティタグ内:

public List<Key> posts;

たとえば、特定のタグが付いたすべての投稿をクエリするのは簡単ですが、タグのリストが付いているすべての投稿を取得するにはどうすればよいですか?タグごとにクエリを実行してから結果を交差させることもできますが、投稿が多いと時間がかかるため、もっと良い方法があるかもしれません。

もう1つ難しいのは、投稿を作成することです。共通のタグを持つ投稿を共通のタグの数順に並べて、何らかの方法でこれに「類似した」投稿を取得できるようにします。

まあ、結合を使用すると、これははるかに簡単になりますが、私はアプリエンジンから始めており、結合を置き換える良い方法を本当に考えることはできません。

ありがとう!

4

3 に答える 3

5

この設計では、特にいくつかのタグが非常に一般的であると予想される場合は、Tag Entity がボトルネックになる可能性があると思います。私が考えることができる 3 つの具体的な問題は、get と put の効率、書き込みの競合、インデックスの爆発です。例として、stackoverflow を見てみましょう。現在、「java」というタグが付いた投稿が 14,000 件あります。

  1. つまり、Java タグ エンティティを取得する必要があるたびに、データストアから 14k 相当のキー データを取得していることになります。その後、プットを行うときにすべてを送り返しています。それは多くのバイトになる可能性があります。
  2. バイトが前後に移動することに加えて、各書き込みではインデックスを更新する必要があります。ListProperty の各エントリは、個別のインデックス エントリにマップされます。そのため、多くのインデックス更新を行っています。それが私たちを3番に導きます...
  3. インデックスの爆発。各エンティティには、持つことができるインデックス エントリの数に制限があります。制限はエンティティごとに 5000 だと思います。これは、同じタグを持つことができる投稿の数に対する実際の厳しい制限です。

参考文献:

幸いなことに、要件の一部は Post エンティティだけで簡単に処理できます。たとえば、次のようなクエリ フィルターを使用すると、すべてのタグのリストを含むすべての投稿を簡単に見つけることができます。

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

javaまたはappengine タグを含むすべての投稿について、タグごとに 1 つのクエリを実行し、結果を自分で組み合わせる必要があります。現在、データストアは OR/IN タイプの操作を処理していません。

関連する投稿を見つけるのは難しいように思えます。コーヒーを飲みながら考えます。

于 2009-07-03T16:27:30.790 に答える
1

GoogleIOからこのビデオをチェックすることをお勧めします。リレーションインデックスエンティティは必要なものでありList<Key> postsTagエンティティから削除できます。エンティティだけでなくList<Key> tagsPost

于 2009-07-09T06:43:52.257 に答える
1

これに関する @topchef のブログ投稿を参照してください: Efficient Keyword Search with Relation Index Entities and Objectify for Google Datastore . Relation Index Entities と Objectify を使用したリスト プロパティによる検索の実装について説明しています。

于 2011-04-26T03:31:25.360 に答える