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 回しか変更できないため、頻繁に使用されるタグの場合、変更の遅延によるボトルネックも発生します。
助言がありますか?