我想知道使用PolyModel而不是Google App Engine中的模型的成本是多少,关于索引等等。使用PolyModel而不是模型是否存在基本成本,即使它没有被子类化?
答案 0 :(得分:6)
PolyModel使用“class”列表属性来存储PolyModel实例“是”的所有类。因此,如果你有一个名为Bar的子类的PolyModel Foo,任何Bar的实例都会在它的“class”属性中有[u'Foo',u'Bar']。 Bar的实例实际上存储在数据存储区中,作为Foo的实例,其中Bar类型名称位于“class”属性中。
需要对“class”属性建立索引,因此每次写入PolyModel子类都会对列表中的每个类名的“class”索引产生额外的两次写入(一个用于降序,一个用于升序),因此如果模型的“class”属性包含[u'Foo',u'Bar']它将需要4个额外的索引写入来编写该模型。
当您在数据存储区查询Foo实例时,数据存储区可以查看每个具有Foo作为父模型的模型,而不必过滤“class”属性(我不确定它是否会过滤上课,但我怀疑它没有。)
当您在数据存储区查询Bar的实例时,它实际上会查询Foo的实例,但在“class”属性上应用过滤器以将结果过滤到Bar类型的模型。如果您没有应用其他过滤器和排序顺序,您可能不会在复合索引中注意到这一点,但如果应用过滤器并对排序进行排序,则数据存储可能要求您的复合索引包含“class”属性,这可能需要您拥有更多的复合索引并写入更多的复合索引。
我的一个应用程序在PolyModel上使用多个级别的继承,几乎每个查询都对“已创建”的DateTimeProperty进行排序。这些查询中的每一个都需要一个带有“class”的复合索引。在我的情况下,额外的索引写入完全是值得的,因为PolyModel允许我以一种很好的方式对数据建模。
2012年2月7日更新以包含来自@Nick的信息。