在Google应用引擎数据存储区中执行ONE:ONE关系的最有效方法是什么?

时间:2011-08-15 22:22:47

标签: python google-app-engine

即使我完全了解AppEngine数据存储区,我也不知道答案。我试图避免编写和运行所需的所有代码来解决它,希望有人已经知道答案。

我的代码如下:

class AddlInfo(db.Model)
     user = db.ReferenceProperty(User)
     otherstuff = db.ListProperty(db.Key, indexed=False)

用以下内容创建记录:

info = AddlInfo(user=user)
info.put()

要获得此对象,我可以执行以下操作:

# This seems excessively wordy (even though that doesn't directly translate into slower)
info = AddlInfo.all().filter('user =', user).fetch(1)

或者我可以做类似的事情:

class AddlInfo(db.Model)
     # str(user.key()) is the key to this record
     otherstuff = db.ListProperty(db.Key, indexed=False)

创作看起来像:

info = AddlInfo(key_name=str(user.key()))
info.put()

然后获取信息:

info = AddlInfo.get(str(user.key()))

我不需要AddlInfo中的reference_property,(我首先使用用户对象)。哪个更快/更少资源?

==================

我这样做的部分原因是,其他人可能是100多个密钥的列表,我有时只需要它们(可能不到50%的时间)我试图通过不提高效率来提高效率在每个请求上加载那些100多个密钥......

2 个答案:

答案 0 :(得分:1)

在这两个选项之间,第二个选项稍微便宜一点,因为您通过推理确定密钥而不是在远程索引中查找密钥。

正如Wooble所说,将一切保留在一个实体上仍然更便宜。如果您只需要一种方法来存储一堆可选的临时属性,请考虑Expando

答案 1 :(得分:0)

第二种方法是更好的方法,只需一次修改:不需要使用用户的整个密钥作为该实体的密钥名称 - 只需使用与用户记录相同的密钥名称。