python - 用于查找用户最喜欢的故事的良好数据模型

标签 python google-app-engine google-cloud-datastore

原创设计

这是我最初设置模型的方式:

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。新的 FavoriteIndex 模型 的每个实例都有一个 Story 实例作为父级。每个 FavoriteIndex 都在其 favorited_by 属性中存储用户 ID 列表。

如果我想找到某个用户收藏的所有故事:

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 个故事之后,但这就是我喜欢它的原因:

  1. 最喜欢的故事与用户关联,而不是与她的用户数据

  2. 在我显示故事的页面上,很容易询问故事是否已被收藏(无需调用一个单独的实体填充用户数据)。

    fav_index = FavoriteIndex.all().ancestor(story).get()
    fav_of_current_user = users.get_current_user().user_id() in fav_index.favorited_by
    
  3. 也很容易得到所有收藏了一个故事的用户的列表(使用#2 中的方法)

有没有更简单的方法?

请帮忙。这种事情一般是怎么做的?

最佳答案

您所描述的是一个很好的解决方案。但是,您可以进一步优化它:对于每个收藏夹,创建一个“UserFavorite”实体作为相关 Story 条目的子实体(或等效地,作为 UserInfo 条目的子实体),键名设置为用户的唯一ID。这样,您可以通过简单的获取来确定用户是否收藏了故事:

UserFavorite.get_by_name(user_id, parent=a_story)

get 操作比查询快 3 到 5 倍,因此这是一个实质性的改进。

关于python - 用于查找用户最喜欢的故事的良好数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1562131/

相关文章:

python - 我尝试在我的Django应用程序中使用Google Analytics(分析),但无法正常工作

python - 为什么列表理解会给我项目未定义错误?

python - 使用 App Engine oauth 服务

python - 谷歌应用程序引擎 - python,迭代数据模型属性

python - 使用 pd.melt 将列转换为两个单独的可变值列

Python根据键值对更新字典

python - Google App Engine - 应用程序无法发送日志

java - Google Datastore 的“更新”行为

database - 与祖先一起设计数据存储模型

java - App Engine 数据存储区中的标签管理?