0

我在这,我用一个型号有许多需要的所有实体和一些特定于两个备选方案中的一个,就像在下面的例子中性能的情况经常型号:为Expando VS空白的属性

class Machine(ndb.Model): 

    #Properties for all machines: 
    price = ndb.FloatProperty() 
    model = ndb.StringProperty() 
    vendor = ndb.KeyProperty() 
    #... 

    #Properties exclusive to type A machines: 
    foo1 = ndb.StringProperty() 
    foo2 = ndb.StringProperty() 

    #Properties exclusive to type B machines: 
    bar1 = ndb.StringProperty() 
    bar2 = ndb.StringProperty() 

从我所理解的,我可以采取两种途径之一。要么我把它定义为一个常规的ndb.Model,只留下一些没有内容的属性,或者我可以使用一个ndb.Expando模型,并提前设置固定属性,并根据具体情况添加其他属性。

据我所知,当您不知道您需要的属性时,Expando Model很有用,但我事先知道所需的所有属性(foo1,foo2,bar1,bar2)。我应该使用Expando还是使用常规的ndb.Model并为每个实体留下一些属性为空?

回答

1

对于您的情况我会认真考虑使用ndb.PolyModel

class Machine(ndb.Model): 

    #Properties for all machines: 
    price = ndb.FloatProperty() 
    model = ndb.StringProperty() 
    vendor = ndb.KeyProperty() 

class MachineA(Machine): 
    foo1 = ndb.StringProperty() 
    foo2 = ndb.StringProperty() 

class MachineB(Machine): 
    bar1 = ndb.StringProperty() 
    bar2 = ndb.StringProperty() 

这就使您可以查询所有机械的,

由Machine.query()或单个机器类型与MachineB.query ()

只是我的2C。 (我有很多项目都使用这种方式,例如,一个产品和不同的产品类型具有不同的附加属性),例如一个工厂与一个泵,都是基本产品,包括价格,分类,照片等),但一个工厂将有不同的分类(开花,不开花)和一个泵将有流量,瓦特等)但我可以找到所有产品所有产品< $ 25(植物或其他)Product.query(Product.price < 25)

+0

感谢您的回答!如果Machine是StructuredProperty,我也可以这样做吗?我也有这种情况发生,完全像这样,而不是Machine是一个完整的实体,它是一个StructuredProperty(一个更大的实体内的属性)。在这种情况下,我仍然可以按照你的建议去做吗? –

+0

虽然最终的结果可能相似,但方法不同,各有优缺点。在嵌套重复属性方面存在一些限制,并且对于嵌套的结构化属性的项目的查询在许多场景中无法按照您喜欢的方式工作。 –

+0

在我的情况下,他们没有太多数据,它只与实体相关,并且从我测试过的数据来看,它足以用于查询目的。我的意思是有这样的例子:class“Things”具有结构化属性Machine有两种类型:MachineA和MachineB。这是可能的还是应该避免它? –