オリジナルデザイン
これが私が最初に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 の方法を使用)。
もっと簡単な方法はありますか?
助けてください。この種のことは通常どのように行われますか?