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中要做的,而是在数据存储中要做的。