Python 从AppEngine中的db.Expando类继承有缺点吗?
我正在考虑让我的所有模型都继承自db.Expando类,以支持松散的非规范化协议,其中db.ReferenceProperty引用的模型的选定属性也将设置在所属类上Python 从AppEngine中的db.Expando类继承有缺点吗?,python,google-app-engine,Python,Google App Engine,我正在考虑让我的所有模型都继承自db.Expando类,以支持松散的非规范化协议,其中db.ReferenceProperty引用的模型的选定属性也将设置在所属类上 class ImgModel(db.Expando): height = db.IntegerProperty() width = db.IntegerProperty() url = db.StringProperty() img_data = db.BlobReferenceProperty()
class ImgModel(db.Expando):
height = db.IntegerProperty()
width = db.IntegerProperty()
url = db.StringProperty()
img_data = db.BlobReferenceProperty()
class company(db.Expando):
logo = db.DenormalizedImgProp(prefix=u'logo')
class DenormalizedImgProp(db.ReferenceProperty):
denorm_attrs = [u'height', u'width', u'url']
def __init__(self,prefix,verbose_name,collection_name,**attrs):
super(DenormalizedImgProp, self).__init__(ImgModel,verbose_name,collection_name,**attrs)
self.denorm_field_prefix = prefix
def __set__(self, model_instance, value):
super(DenormalizedImgProp, self).__set__(model_instance, value)
for attr in self.denorm_attrs:
setattr(model_instance, u'%s_%s' %
(self.denorm_field_prefix, attr),value)
让所有模型从Expando类继承是否存在性能缺陷?我知道需要更多的检查来解释某些特性,但我真正感兴趣的是这是否从根本上可以接受。为了回答这个问题,使用动态属性的大多数缺点只是失去了属性定义的好处:必须测试对象上是否存在某些属性,无法查询某些_属性未设置的实体,在实体上的值与查询中的值具有不同类型的查询中缺少结果,在验证和检查要从数据存储中提取的内容时需要付出更多的努力 数据存储并不关心是否提供属性类型信息,因此在这个级别上,我不认为有任何真正的性能影响 我假设代码最终会像预期的那样工作,编写ImgModel和公司等不会有任何问题 这让我担心的是,您需要小心索引。Expando使创建大量动态属性变得更容易,而不必考虑对索引的影响。索引越多,属性值更改时写入对象的时间越长。对多个属性和多个值进行排序或不等过滤的查询越多,就越容易获得大量自定义索引。由于要自动创建这些动态属性,因此必须确保代码的微小更改不会破坏索引
我认为这是一个很难完全从理论上回答的问题。性能将在很大程度上取决于您实际做了什么,很少的实现细节,以及这些因素如何与平台交互。不管是好是坏,针对本地应用服务器编写的代码有时会在生产中产生意想不到的效果。因此,最终如果这是您真正想要做的事情,我认为您应该使用一种更简单的方法来部署和测试它,并自行判断它是否“足够好”。回答标题,使用动态属性的大多数缺点只是失去了属性定义的好处:必须测试对象上是否存在某些_属性,无法查询某些_属性未设置的实体,缺少实体上的值与查询中的值具有不同类型的查询结果,在验证和检查您从数据存储中提取的内容方面需要更多的努力 数据存储并不关心是否提供属性类型信息,因此在这个级别上,我不认为有任何真正的性能影响 我假设代码最终会像预期的那样工作,编写ImgModel和公司等不会有任何问题 这让我担心的是,您需要小心索引。Expando使创建大量动态属性变得更容易,而不必考虑对索引的影响。索引越多,属性值更改时写入对象的时间越长。对多个属性和多个值进行排序或不等过滤的查询越多,就越容易获得大量自定义索引。由于要自动创建这些动态属性,因此必须确保代码的微小更改不会破坏索引 我认为这是一个很难完全从理论上回答的问题。性能将在很大程度上取决于您实际做了什么,很少的实现细节,以及这些因素如何与平台交互。不管是好是坏,针对本地应用服务器编写的代码有时会在生产中产生意想不到的效果。因此,最终如果这是您真正想要做的事情,我认为您应该使用一种更简单的方法来部署和测试它,并自己判断它是否“足够好”