数据存储区设计:1大类与2类对比多态?

时间:2014-01-19 21:37:20

标签: google-app-engine database-design google-cloud-datastore

我有兴趣了解为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。

这些用途有多种:

  • 查询+列表(+排序)部分:列出部件时,我需要显示汽车的标题,并获取其external_id和年份(所以我不需要所有东西,但通过访问部件获取整个汽车实体.parent,我已经在使用父预取了。)
  • 查询+列表(+排序)汽车:只需要标题,年份和imgurl。
  • 获取汽车:包含所有汽车详情的页面,需要所有属性。

考虑到我获取和显示数据的方式,上述设计与以下设计之间的最佳选择(提供优缺点)是什么?

选项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的假设是否正确,也不确定是否有任何其他隐藏的优点/缺点,甚至其他选项。

1 个答案:

答案 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的零件但是您总是需要所有零件,那么请使用多个零件。

如果您需要所有信息与其中某些信息相比,您确实需要查看特定视图的使用频率,以确定最佳策略。