SelfReferenceProperty与ListProperty Google App Engine

时间:2010-03-22 21:01:34

标签: python google-app-engine

我正在尝试使用Google App Engine并提出问题。

为了简单起见,假设我的应用程序正在建模一个计算机网络(一个拥有10,000个节点的相当大的企业网络)。我正在尝试按如下方式对我的Node类进行建模:

class Node(db.Model):
    name = db.StringProperty()
    neighbors = db.SelfReferenceProperty()  

让我们假设一分钟,我不能使用ListProperty()。根据我迄今为止的实验,我只能将一个实体分配给“邻居” - 我不能使用“虚拟”集合(node_set)来访问Node邻居列表。

所以...我的问题是:

  1. SelfReferenceProperty是否将您限制为可以引用的单个实体?
  2. 如果我使用ListProperty,我相信我只能使用5,000个密钥,我需要超过它。
  3. 更新

    所有人都像我一样裹着我的短裤,我忘记了* ReferenceReleationship是“倒退” - 事物的“列表”指向关系的一方。 SelfReferenceProperty正如我所想的那样工作。我的错。我仍然需要处理关系的大“多”方面 - 我不认为ListProperty会做这个伎俩,但我会发布我发现的内容。

    谢谢, 约翰

1 个答案:

答案 0 :(得分:1)

Re 1,yes(如果我理解你的要求):对于模型中的每个属性,模型的每个实例(AKA“entity”)都具有该属性的一个值。所以例如对于给定实体,IntegerProperty具有一个整数值,SelfReferenceProperty具有给定实体的一个值(内部为键字符串),并且等等。当然,并非所有模块实例的值,但我不相信这就是你的意思。

Re 2,5000限制(哇,这是单个节点图的邻居很多,只有10000个节点!)我相信你指的是实体的索引 - 本文更好地解释了限制。

一种可能的解决方法是在节点上根本没有neighbors属性,而是一个单独的Connection模型来表示从一个节点到另一个节点的连接(具有ReferenceProperty属性,在Connection中,每个引用一个Node)。在连接中你需要一些额外的东西(例如,受影响节点的传入和传出连接的渐进计数),当然能够获取数千个它们(在多个查询中,给定1000个一次)限制)。