オリジナルデザイン
これが私が最初にModels
セットアップした方法です:
class UserData(db.Model):
user = db.UserProperty()
favorites = db.ListProperty(db.Key) # list of story keys
# ...
class Story(db.Model):
title = db.StringProperty()
# ...
ストーリーを表示するすべてのページで、現在のユーザーの UserData をクエリします。
user_data = UserData.all().filter('user =' users.get_current_user()).get()
story_is_favorited = (story in user_data.favorites)
新しいデザイン
Google I/O 2009 - Scalable, Complex Apps on App Engineの講演を見た後、もっと効率的にセットアップできないかと考えました。
class FavoriteIndex(db.Model):
favorited_by = db.StringListProperty()
はStory Model
同じですが、 を削除しましたUserData Model
。new の各インスタンスには、親としてインスタンスFavoriteIndex Model
があります。Story
そして、それぞれがそのプロパティFavoriteIndex
にユーザー ID のリストを格納しfavorited_by
ます。
特定のユーザーがお気に入りにしたすべてのストーリーを検索したい場合:
index_keys = FavoriteIndex.all(keys_only=True).filter('favorited_by =', users.get_current_user().user_id())
story_keys = [k.parent() for k in index_keys]
stories = db.get(story_keys)
このアプローチは、ListProperty に関連付けられているシリアル化/逆シリアル化を回避します。
効率とシンプルさ
特にユーザーが 300 のストーリーをお気に入りに登録した後では、新しいデザインがどれほど効率的かはわかりませんが、私が気に入っている理由は次のとおりです。
お気に入りのストーリーは、ユーザーではなくユーザーに関連付けられています
user data
を表示するページでは、お気に入りに追加され
story
ているかどうかを簡単にstory
確認できます (ユーザー データで満たされた別のエンティティを呼び出す必要はありません)。fav_index = FavoriteIndex.all().ancestor(story).get() fav_of_current_user = users.get_current_user().user_id() in fav_index.favorited_by
ストーリーをお気に入りにしたすべてのユーザーのリストを取得するのも簡単です (#2 の方法を使用)。
もっと簡単な方法はありますか?
助けてください。この種のことは通常どのように行われますか?