我有兴趣了解为Google App Engine的数据存储设计课程的几种方法的优缺点。
考虑以下课程:
选项0
class Car(db.Model):
title = db.StringProperty()
year = db.StringProperty()
imgurl = db.StringProperty()
type = db.StringProperty()
addeddate = db.DateTimeProperty()
external_id = db.IntegerProperty()
# possibly 5 or 6 more properties
class Part(db.Model):
title = db.StringProperty()
# other stuff
部分的父级始终设置为创建时对应的Car。
这些用途有多种:
考虑到我获取和显示数据的方式,上述设计与以下设计之间的最佳选择(提供优缺点)是什么?
选项1
class Car(db.Model):
title = db.StringProperty()
year = db.StringProperty()
imgurl = db.StringProperty()
class CarEx(db.Model):
type = db.StringProperty()
addeddate = db.DateTimeProperty()
external_id = db.IntegerProperty()
# possibly 5 or 6 more properties
Pro:获取部件时,获得父母(Car)的速度更快,因为属性较少。
Con:展示汽车时,我们需要获得CarEx。添加汽车时需要再添加一个实体。删除汽车时需要删除CarEx。
选项2
class Car(db.PolyModel):
title = db.StringProperty()
year = db.StringProperty()
imgurl = db.StringProperty()
class CarEx(Car):
type = db.StringProperty()
addeddate = db.DateTimeProperty()
external_id = db.IntegerProperty()
# possibly 5 or 6 more properties
添加汽车时,我们只会添加CarEx实体。
Pro:获取部件时,获取父项(Car)的速度更快,因为属性较少。的 ???我实际上并不确定这是真的。 ???
Pro:在显示汽车时,我们获得了CarEx。无需获得另一个实体。添加和删除汽车就像只有1辆车型一样容易(选项0)。
Con:添加CarEx时额外写入。其他额外费用?
总的来说,我需要能够获取零件(和他们的父母,没有巨大的成本),我需要在一个单独的页面上获取一个完整的汽车。我不确定我对PolyModel的假设是否正确,也不确定是否有任何其他隐藏的优点/缺点,甚至其他选项。
答案 0 :(得分:2)
几点,如果你刚开始,你真的应该使用ndb。
您列出的少量属性不会对使用Car和CarEx产生足够的影响。特别是如果你一直需要CarEx。
考虑到PolyModel的工作方式,使用PolyModel没有意义。多模型更适合
class Vehicle(PolyModel):
title = StringProperty
year = StringProperty()
addeddate = db.DateTimeProperty()
external_id = db.IntegerProperty()
# possibly 5 or 6 more properties
class Car(Vehicle):
doors = IntegerProperty
class Van(Vehicle):
carrying_capacity = FloatProperty() #(m3)
class Truck(Vehicle):
tray_length = IntegerProperty()
是的,设计,属性。但现在我可以通过任何核心车辆属性搜索所有车辆,并获得卡车和货车和汽车。你不能用普通的模型继承做到这一点。如果没有PolyModel,您必须单独搜索Car,Truck实体类型。
在你的情况下,你可能不需要这个。
您对Parts
所做的事情在很大程度上取决于您需要它们的次数和频率。如果您的Parts
可能少于1MB,并且在需要Parts
时需要所有Parts
,那么请考虑将零件存储在单个容器实体中,并使用重复的StructuredProperty存储他们。然后,当您需要部件时,可以在单个实体中获取它们。如果您只需要某些部件,则将它们存储为单独的实体。
如果您需要超过1MB的零件但是您总是需要所有零件,那么请使用多个零件。
如果您需要所有信息与其中某些信息相比,您确实需要查看特定视图的使用频率,以确定最佳策略。