1

一对多的关系我有以下型号...许多与NDB在谷歌应用程序引擎

class User(ndb.Model): 
    email = ndb.StringProperty() 
    username = ndb.StringProperty(indexed=True) 
    password = ndb.StringProperty() 

class Rel(ndb.Model): 
    user = ndb.KeyProperty(kind=User, indexed=True) 
    follows = ndb.KeyProperty(kind=User, indexed=True) 
    blocks = ndb.KeyProperty(kind=User) 

我想使它这样用户可以按照或阻止用户的任何其它号码。

使用上述设置,我发现很难执行,将是很容易与传统的DBMS任务。

举一个简单的例子,我怎么会找到所有在心中的使用者名称,保持给定用户的追随者和秩序,当我执行上相对查询,我取回钥匙,而不是用户对象?

我该怎么做呢?

+2

在Rel实体中存储冗余信息以帮助您查询。例如存储以下密钥的用户名,因此您不必执行提取操作。这不是您在RDBMS中所做的,而是您将如何处理数据存储。 –

回答

2

你必须做一个获取,但你可以去以更好的方式设计它,

的遵循和块字段可以是列表,而不是仅仅关键 - 在此之后

follows = ndb.KeyProperty(kind=User, repeated=True) 
blocks = ndb.KeyProperty(kind=User, repeated=True) 

当你需要此用户的以下内容,您可以获取密钥并执行ndb.get_multi(Keys_list)以获取所有后续/块实体,无论您需要什么。

OR

这样做的更好的办法 -

如果你关心的秩序,要进行分页,你将不得不单独 存储所有的跟踪/块的实体,例如,如果这是关于一个用户“A”

跟随实体将记录每个人的“一”如下

class FollowEntity(ndb.Model): 
    user = ndb.KeyProperty(kind=User) 
    follow = ndb.KeyProperty(kind=User) 
    follow_username = ndb.StringProperty() 

查询可以 假设user是从“用户”实体的条目。

您可以运行此查询,并得到排序结果的用户名,如果您使用fetch_page显示在一个批次的结果会很好地工作。

对BlockEntity也一样