我正在设计数据存储模型,并在考虑查询过滤器的工作方式时尝试确定最佳方法。
最好,如果我只写出两个例子。第一个例子是如果我有一个固定的“性别”属性只有一个字符串,可以设置为“男性”或“女性”。
class Person(db.Model):
name = db.StringProperty()
gender = db.StringProperty()
p1 = Person(name="Steve", gender="male")
p2 = Person(name="Jane", gender="female")
p1.put()
p2.put()
males = db.GqlQuery("SELECT * FROM Person WHERE gender = :1", "male")
第二个例子是如果Person实体是一个expando模型,我动态设置一个“is_male”或“is_female”动态属性。
class Person(db.Expando):
name = db.StringProperty()
p1 = Person(name="Steve")
p1.is_male = True
p1.put()
p2 = Person(name="Jane")
p2.is_female = True
p2.put()
males = db.GqlQuery("SELECT * FROM Person WHERE is_male = :1", True)
现在假设我们收集了数百万条记录,并且我们想要进行查询,上述两种方法中的哪一种在生产运行Python 2.7的Google App Engine中会更快?
答案 0 :(得分:3)
绝对没有区别 - 无论属性是否为“动态”,模型在数据存储区中看起来都是一样的。唯一的区别是没有设置值的标准属性类将在数据存储区中插入值为None
的字段,这会占用一些额外的空间,但允许您查询未设置该值的用户。
答案 1 :(得分:2)