Google app engine 谷歌应用程序引擎中PolyModel的成本高于Model

Google app engine 谷歌应用程序引擎中PolyModel的成本高于Model,google-app-engine,Google App Engine,我想知道在Google App Engine中使用PolyModels而不是模型的成本是多少,比如索引等。使用PolyModel而不是模型(即使它从未被子类化)是否有基本成本 PolyModel使用“class”列表属性来存储PolyModel实例“是”的所有类。因此,如果您有一个具有称为Bar的子类的PolyModel Foo,Bar的任何实例的“class”属性中都会有[u'Foo',u'Bar']。Bar的实例实际上作为Foo的实例存储在数据存储中,Bar模型名称位于“class”属性中

我想知道在Google App Engine中使用PolyModels而不是模型的成本是多少,比如索引等。使用PolyModel而不是模型(即使它从未被子类化)是否有基本成本

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上使用多级继承,几乎每个查询都在一个“created”DateTimeProperty上排序。这些查询中的每一个都需要一个包含“class”的复合索引。在我的例子中,额外的索引写入是完全值得的,因为PolyModel允许我以一种好的方式对数据建模


于2012年2月7日更新以包含@Nick的信息。

类属性实际上是一个列表;对于任何polymodel子类,它将包含至少2个条目;对于内置索引,这意味着至少有4次索引写入。