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列表并将其用作帖子查询的过滤条件呢?
类似于:
results = Posts.query(Post.PostID IN postIDList.PostID)
在普通的关系数据库中,这是一个使用表连接的简单查询。在Google的ndb中如何做到这一点?
发布于 2017-09-29 20:00:38
如果您试图以在关系数据库中设计表的相同方式来设计数据存储模型,那么您将遇到许多瓶颈。
你的评论可能会朝着一个正确的方向发展,尽管还有其他解决方案。沿着这条路线,我将完全放弃"subscribedPosts“模型,在用户模型中使用重复的KeyProperty实体来存储订阅的帖子。
请参阅相关帖子:One-To-Many Example in NDB
发布于 2017-09-30 07:36:42
似乎您希望建立多对多关系的模型,而不是一对多关系。阅读Modelling Entity Relationships (虽然这是针对较老的db
,而不是较新的ndb
,但它仍然给出了想法)。
两个实体中的一个应该维护相关其他实体的密钥列表(repeated=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)
https://stackoverflow.com/questions/46495723
复制相似问题