Google App Engine NDB数据模型如下:
Users
Username
FirstName
LastName
Posts
PostID
PosterUsername
SubscribedPosts
PostID
SubscriberUsername
对于特定用户,我想返回用户订阅的所有帖子并在页面上显示。
由于精彩的NDB不支持JOIN,我们会做两个查询:
postIDList =
SubscribedPosts.query(SubscribedPosts.SubscriberUsername == 'johndoe').fetch()
这为我们提供了SubscribedPosts列表。那么如何获取postIDList列表并将其用作Posts查询的过滤条件?
类似的东西:
results = Posts.query(Post.PostID IN postIDList.PostID)
在普通的关系数据库中,这将是一个使用表连接的简单查询。这是如何在Google的ndb中完成的?
答案 0 :(得分:2)
如果您尝试设计数据存储区模型,就像在此示例中设计关系数据库中的表一样,那么您将遇到许多瓶颈。
尽管还有其他解决方案,但您的评论可能是一个正确的方向。走这条路,我会放弃" subscribedPosts"模型一共使用User模型中的重复KeyProperty实体来存储订阅的帖子。
请参阅此相关帖子:One-To-Many Example in NDB
答案 1 :(得分:2)
似乎您希望模拟多对多关系,而不是一对多关系。阅读Modelling Entity Relationships(虽然这是针对年龄较大的db
,而不是较新的ndb
,但它仍然提出了这个想法。
两个实体中的一个应该维护相关其他实体的密钥列表(重复= True)。哪个实体应该列出清单?优选地,列表应该在通常具有较少关系的一侧,使得密钥列表较小。另一个考虑因素是哪一方可能对更新争用较少。
在您的具体情况下,让我们说平均用户订阅10个帖子,并且平均说每个帖子有100个用户订阅它。在这种情况下,我们希望将键列表放在关系的Users
侧。
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
实例中的列表来建立关系:
current_user.posts.append(current_post.key)
对于给定的Users
个实例,由于订阅的Posts
的密钥列表已在给定的Posts
内,因此轻松获取所有订阅的Users
:
ndb.get_multi(given_user.posts)
对于给定的Posts
个实例,请通过...
Users
query = Users.query(Users.posts == given_post.key)