我正在试用 Google App Engine 并有一个问题。
为简单起见,假设我的应用正在为计算机网络建模(一个相当大的企业网络,有 10,000 个节点)。我正在尝试按如下方式对我的 Node 类进行建模:
class Node(db.Model):
name = db.StringProperty()
neighbors = db.SelfReferenceProperty()
暂时假设我不能使用 ListProperty()。根据我迄今为止的实验,我只能将一个实体分配给“邻居”——而且我不能使用“虚拟”集合 (node_set) 来访问节点邻居列表。
所以...我的问题是:
- SelfReferenceProperty 是否将您限制为您可以引用的单个实体?
- 如果我改为使用 ListProperty,我相信我的键数限制为 5,000 个,我需要超过这个数量。
更新
我当时全神贯注,忘记了 *ReferenceRelationship 是“倒退的”——事物的“列表”指向关系的一侧。 SelfReferenceProperty 的工作方式与我想象的一样。我的错。我仍然需要处理关系中较大的“多”面 - 我认为 ListProperty 无法解决问题,但我会发布我的发现。
谢谢, 约翰
请您参考如下方法:
关于 1,是的(如果我理解正确的话你在问什么):对于模型中的每个属性,模型的每个实例(也称为“实体”)都有该属性的一个值.所以例如IntegerProperty 具有给定实体的 一个 整数值,SelfReferenceProperty 具有一个 值(内部键字符串)对于给定的实体,等等。当然,模块的所有实例都不是单个值,但我不相信那是你的意思。
关于 2,5000 个限制(哇,对于一个总共只有 10000 个节点的单节点图来说,这是一个 很多 的邻居!)我相信你指的是 实体的索引——这篇文章更好地解释了这个限制。
一个可能的解决方法是在节点上完全没有 neighbors 属性,而是一个单独的 Connection 模型来表示从一个节点到另一个节点的连接(使用 ReferenceProperty 属性,在连接中,每个属性都引用一个节点)。当然,您需要在 Connection 中添加一些额外的东西(例如,受影响节点的传入和传出连接的累进计数)才能获取数千个(在多个查询中,一次 1000 个)限制)。
