原创设计
这是我最初的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
在我显示 a 的页面上
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中的方法)
有没有更简单的方法?
请帮忙。这种事情通常是怎么做的?