Google App Engine中模型的PolyModel成本

Yar*_*rin 2 google-app-engine

我想知道使用PolyModels比使用Google App Engine中的模型的成本是多少,关于索引等等.使用PolyModel而不是模型是否存在基本成本,即使它没有被子类化?

Bry*_*utt 6

PolyModel使用"类"列表属性来存储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的信息.