自引用属性与列表属性 Google App Engine
我正在尝试使用谷歌的应用引擎,有一个问题想请教。
为了简单起见,假设我的应用是在模拟一个计算机网络(一个相当大的公司网络,有10,000个节点)。我想把我的节点类设计成这样:
class Node(db.Model):
name = db.StringProperty()
neighbors = db.SelfReferenceProperty()
假设一下,我不能使用ListProperty()。根据我目前的实验,我只能把一个实体分配给“邻居”——而且我不能使用“虚拟”的集合(node_set)来访问节点的邻居列表。
所以……我有几个问题:
- SelfReferenceProperty是否限制你只能引用一个实体?
- 如果我使用ListProperty,我相信我只能有5,000个键,但我需要超过这个限制。
更新
我当时有点紧张,忘了*ReferenceRelationship是“反向”的——“列表”指向关系的一方。SelfReferenceProperty的工作方式和我想的一样。我的错。我仍然需要处理关系中较大的一方——我觉得ListProperty可能不够用,但我会把我的发现分享出来。
谢谢,
约翰
1 个回答
关于第一个问题,是的(如果我理解你问的没错):在一个模型里,每个属性对于模型的每个实例(也叫“实体”)都有一个值。举个例子,一个IntegerProperty
对于某个实体来说只有一个整数值,一个SelfReferenceProperty
对于某个实体也只有一个值(内部是一个键字符串),等等。当然,这不是说所有实例共享一个值,我想这不是你想表达的意思。
关于第二个问题,你提到的5000限制(哇,这对于一个只有10000个节点的单节点图来说,邻居数量可真是多啊!)我认为是指实体的索引限制——这篇文章对这个限制解释得更清楚。
一个可能的解决办法是,节点上根本不设置neighbors
属性,而是使用一个单独的Connection
模型来表示一个节点与另一个节点之间的连接(在Connection中使用ReferenceProperty
属性,每个都指向一个节点)。当然,你需要在Connection中添加一些额外的信息(例如,受影响节点的进出连接的逐步计数),这样才能在多个查询中获取成千上万的连接,因为每次只能处理1000个。