【发布时间】:2014-01-19 21:37:20
【问题描述】:
我有兴趣了解为 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
部件的父级在创建时始终设置为相应的汽车。
它们有多种使用方式:
- 查询+列表(+排序)部分:列出部分时,我需要显示汽车的标题,并获取它的external_id和年份(所以我不需要所有内容,而是通过访问部分获取整个汽车实体.parent,我已经在使用父级预取)。
- 查询+列表(+排序)汽车:只需要标题、年份和imgurl。
- get 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
专业人士:在获取 Parts 时,获取父级 (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 实体。
专业版:获取 Parts 时,获取父级 (Car) 更快,因为属性较少。 ???我实际上完全不确定这是真的。 ???
专业人士:当显示汽车时,我们会得到 CarEx。无需获取另一个实体。添加和删除汽车就像只有 1 个包含所有内容的汽车模型一样简单(选项 0)。
Con:添加 CarEx 时额外写入。其他额外费用?
因此,总的来说,我需要能够获取零件(以及它们的父级,而不需要大量成本),并且我需要在单独的页面上获取完整的汽车。我不确定我对 PolyModel 的假设是否正确,也不确定是否有任何其他隐藏的优点/缺点,甚至其他选项。
【问题讨论】:
标签: google-app-engine database-design google-cloud-datastore