Python 在Google App Engine上与NDB建立多对多关系

Python 在Google App Engine上与NDB建立多对多关系,python,google-app-engine,google-cloud-datastore,app-engine-ndb,webapp2,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,Webapp2,我有以下型号 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.KeyPropert

我有以下型号

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容易执行的任务

作为一个简单的例子,我如何找到给定用户的所有追随者和按用户名排序的顺序——请记住,当我对Rel执行查询时,我得到的是密钥而不是用户对象


我这样做是不对的吗?

您必须进行提取,但您可以用更好的方式进行设计

follow和blocks字段可以是列表,而不仅仅是键-

follows = ndb.KeyProperty(kind=User, repeated=True)
blocks = ndb.KeyProperty(kind=User, repeated=True)
在此之后,当您需要此用户的以下内容时,您可以获取密钥并执行ndb.get_multi(密钥列表)以获取所有所需的后续/块实体

更好的方法是:

如果您关心顺序并希望分页,则必须单独存储所有跟随/块实体, 例如,如果这是关于用户“a”

以下实体将有以下每个人的记录“a”

class FollowEntity(ndb.Model):
    user = ndb.KeyProperty(kind=User)
    follow = ndb.KeyProperty(kind=User)
    follow_username = ndb.StringProperty()
查询可以是 假设
user
是来自“用户”实体的条目

query = FollowEntity.query(FollowEntity.user == user.key).order(FollowEntity.follow_username)
您可以运行此查询并获得已排序的用户名结果,如果使用fetch_页面成批显示结果,则效果会很好


对BlockEntity也执行同样的操作

在Rel实体中存储冗余信息以帮助您查询。例如,存储以下键的用户名,这样就不必执行提取。这不是在RDBMS中要做的,而是在数据存储中要做的。