5

1 つまたは複数のタグでマークされた (たとえば) 投稿がたくさんあります。投稿は作成または削除できます。また、ユーザーは 1 つまたは複数のタグの検索リクエストを作成できます (論理 AND で結合)。最初に頭に浮かんだアイデアは単純なモデルでした

class Post(db.Model):
  #blahblah
  tags = db.StringListProperty()

作成操作と削除操作の実装は明らかです。検索はより複雑です。N 個のタグを検索するには、"SELECT * FROM Post WHERE tags = :1" のような N 個の GQL クエリを実行し、カーソルを使用して結果をマージしますが、パフォーマンスはひどいものです。

2番目のアイデアは、異なるエンティティでタグを分離することです

class Post(db.Model):
    #blahblah
    tags = db.ListProperty(db.Key) # For fast access

class Tag(db.Model):
    name = db.StringProperty(name="key")
    posts = db.ListProperty(db.Key) # List of posts that marked with tag

キーごとに db からタグを取得し (GQL で取得するよりもはるかに高速)、メモリにマージします。この実装は最初の実装よりもパフォーマンスが優れていると思いますが、非常に頻繁に使用されるタグは、単一のデータストア オブジェクトに許可されている最大サイズを超える可能性があります。 . もう 1 つの問題があります。データストアは 1 つのオブジェクトを 1 秒あたり 1 回しか変更できないため、頻繁に使用されるタグの場合、変更の遅延によるボトルネックも発生します。

助言がありますか?

4

2 に答える 2

1

ニックの質問をさらに進めるために。それが論理積であり、クエリで複数のタグを使用している場合。タグを使用=tag1ANDタグ=tag2...単一のクエリでメンバーシップを設定することは、データストアの優れた機能の1つです。1つのクエリで結果を得ることができます。

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Properties_With_Multiple_Values

于 2010-11-29T05:26:56.630 に答える
0

おそらく可能な解決策は、2 番目の例を取り上げ、より大きなセットで効率的なクエリを実行できるように変更することです。頭に浮かぶ 1 つの方法は、1 つのタグに複数のデータベース エンティティを使用し、いくつかのグループを取得する必要がほとんどないような方法でそれらをグループ化することです。デフォルトの並べ替え順序 (許可されている唯一の並べ替え順序と呼びましょう) が投稿日順である場合は、その順序でタグ グループ エンティティを入力します。

class Tag(db.Model):
    name = db.StringProperty(name="key")
    posts = db.ListProperty(db.Key) # List of posts that marked with tag
    firstpost = db.DateTimeProperty()

グループにタグを追加または削除するときは、そのグループに含まれる投稿の数を確認します。追加する投稿によって投稿が 100 件を超える場合は、2 つのタグ グループに分割します。グループの投稿数が 50 件未満になるように投稿を削除する場合は、前または次のグループからいくつかの投稿を盗みます。隣接するグループの 1 つにも 50 件の投稿がある場合は、それらをまとめてください。投稿をタグ (投稿日順) でリストする場合、少数のグループを取得するだけで済みます。

これでは、需要の高いタグの問題は実際には解決されません。

考えてみれば、インサートはもう少し投機的でもいいかもしれません。最新のタグ グループ エントリを取得し、それらをマージして、新しいタグ グループを配置します。トランザクションの遅延は、実際には実際の問題ではない場合があります。

于 2010-11-25T20:10:48.537 に答える