我正在使用Python中的Google App Engine构建一个网站,但这个问题应该适用于任何类似的东西,而不仅仅是这个特定的框架。我试图在两种相关数据模型之间做出决定。
它们涉及一个Location数据库类,每个Location实体都有多个与之相连的Experience数据库实体。
现在我在他们自己的memcache中有Locations类,我参考了存储在expRef IntegerProperty中的每个体验。然后我会使用Experience.get_by_id(expRef)获取所有体验并在“位置”页面上显示它们。
class Location(ndb.Model):
#a bunch of other properties
expRefs = ndb.IntegerProperty(repeated=True)
class Experience(ndb.Model):
#a bunch of other properties with no ref to Location
#here is the handler for the Location page
location = individual_location_cache(keyid)
exps= []
if location.expRefs != []:
for ref in location.expRefs:
records.append(Record.get_by_id(ref))
我想知道这是不是最好的选择,或者最好是给每个体验一个对Location属性的引用然后将所有引用存储在Memcached中并对memcached进行两次调用,一次用于Location,然后一个用于那里的所有经历。
class Location(ndb.Model):
#a bunch of other properties but no ref to experiences
class Experience(ndb.Model):
#a bunch of other properties
locationRef = ndb.IntegerProperty()
#the Location page handler starts here
location = individual_location_cache(keyid)
exps= exp_location_cache(keyid)
我遗忘了一个很大的区别或任何选择吗?
答案 0 :(得分:0)
你存储它的方式看起来没问题 - 你想要优化的一个非常明显的事情就是批量获取经验:
exps= []
if location.expRefs != []:
for future in [Record.get_by_id_async(ref) for ref in location.expRefs]:
records.append(future.get_result())
这样NDB将尝试通过一个查询获取您的所有体验 - 并自动将它们缓存在内存缓存中。