首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GAE:列表上的NDB查询

GAE:列表上的NDB查询
EN

Stack Overflow用户
提问于 2017-09-30 03:29:10
回答 2查看 395关注 0票数 0

Google App Engine NDB数据模型如下:

代码语言:javascript
运行
复制
Users
    Username
    FirstName
    LastName

Posts
    PostID
    PosterUsername

SubscribedPosts
    PostID
    SubscriberUsername

对于特定的用户,我希望返回该用户订阅的所有帖子,并在页面上显示它们。

由于奇妙的NDB不支持JOIN,我们执行两个查询:

代码语言:javascript
运行
复制
postIDList = 
SubscribedPosts.query(SubscribedPosts.SubscriberUsername == 'johndoe').fetch()

这给了我们一个SubscribedPosts的列表。那么如何获取我的postIDList列表并将其用作帖子查询的过滤条件呢?

类似于:

代码语言:javascript
运行
复制
results = Posts.query(Post.PostID IN postIDList.PostID)

在普通的关系数据库中,这是一个使用表连接的简单查询。在Google的ndb中如何做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2017-09-30 04:00:38

如果您试图以在关系数据库中设计表的相同方式来设计数据存储模型,那么您将遇到许多瓶颈。

你的评论可能会朝着一个正确的方向发展,尽管还有其他解决方案。沿着这条路线,我将完全放弃"subscribedPosts“模型,在用户模型中使用重复的KeyProperty实体来存储订阅的帖子。

请参阅相关帖子:One-To-Many Example in NDB

票数 2
EN

Stack Overflow用户

发布于 2017-09-30 15:36:42

似乎您希望建立多对多关系的模型,而不是一对多关系。阅读Modelling Entity Relationships (虽然这是针对较老的db,而不是较新的ndb,但它仍然给出了想法)。

两个实体中的一个应该维护相关其他实体的密钥列表(repeated=True)。哪个实体应该持有该列表?优选地,列表应该在通常具有较少关系的一侧,以便键列表较小。另一个考虑因素是哪一方对更新的争用可能较少。

在您的特定情况下,假设平均用户订阅10个帖子,每个帖子平均有100个用户订阅它。在本例中,我们希望将键列表放在关系的Users端。

代码语言:javascript
运行
复制
class Users(ndb.Model):
    user_name = ndb.StringProperty()
    first_name = ndb.StringProperty()
    last_name = ndb.StringProperty()
    posts = ndb.KeyProperty(kind='Posts', repeated=True)

class Posts(ndb.Model)
    post_id = ndb.StringProperty()
    poster_user_name = ndb.StringProperty()

通过添加到Users实例中的列表来建立关系:

代码语言:javascript
运行
复制
current_user.posts.append(current_post.key)

对于给定的Users实例,获取所有订阅的Posts很容易,因为订阅的Posts的密钥列表已经在给定的Users

代码语言:javascript
运行
复制
ndb.get_multi(given_user.posts)

对于给定的Posts实例,通过以下方式获取所有订阅的Users

代码语言:javascript
运行
复制
query = Users.query(Users.posts == given_post.key)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46495723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档