1

我正在为作物仓储公司撰写应用程序,该公司购买收获的作物并将其存储在一个或多个仓库中。到目前为止,Google App Engine/Datastore的局限性对我没有任何问题。我对这个项目非常深入,很难回归。与谷歌数据存储/ Python NDB的交易系统中的多对多关系

我必须建立两个种类之间的多对多关系,它们本质上是事务性的(意味着父/祖先查询)。我不确定什么是正确的做法。这是业务逻辑:

  1. 仓库发出特定数量(PO)的采购订单。所以我们为每个采购订单(PO)在PO种类中创建一个实体。

  2. 货物在仓库收到。所以我们在GRN种类中创建一个实体。 (GRN =收货单)。

这是多对多的关系。

  1. 可能需要一个GRN来完成一个PO。

  2. 可能需要一个GRN来完成许多PO。

  3. 许多GRN可能需要完成一个采购订单。

  4. 许多GRN可能需要完成许多PO。

这是代码的相关快照。

class Warehouse(ndb.Models): 
    name = ndb.TextProperty() 
    capacity = ndb.FloatProperty() 
    current_stock = ndb.FloatProperty() 

class PurchaseOrder(ndb.Models): 
    quantity = ndb.FloatProperty() 
    remaining = ndb.FloatProperty() 
    is_complete = ndb.BooleanProperty() 
    grn = ndb.KeyProprty(repeated=True, kind=GRN) 

class GRN(ndb.Models): 
    quantity = ndb.FloatProperty() 
    remaining = ndb.FloatProperty() 
    is_complete = ndb.BooleanProperty() 
    po = ndb.KeyProprty(repeated=True, kind=PurchaseOrder) 

实体组关系

仓库 - > GRN

仓库 - > PO

要建立多 - 到 - 多关系我认为所有相关GRN键在PO记录, GRN记录中所有相关的PO密钥。这对我来说工作得很好。

但是,如果我必须在回复日期编辑GRN或PO,那么我无法处理可能影响其他GRN和PO的级联变化的复杂性。

  • 我读过的地方我应该使用第三个模型来保存多对多的关系,而不是存储相关的键。我无法想象应该包含哪些第三个表。 *

我知道我的问题非常具体,我没有弄清所有的细节。但只是帮助我采用正确的方法处理这种问题模式。我会处理其余的。或者提供任何链接,如果这已经记录在某处。

+0

它是否像你应该保持像PO和GRN之间的同步数量属性或什么? – 2014-10-20 14:55:02

+0

是的,两者需要在重量上保持平衡。 – 2014-10-20 15:26:54

+0

假设一个PO由100KG组成,那么它可以链接到5个20KG的GRN实例。 PO和GRN只有在它们之间的多对多关系由重量平衡时才被认为是完整的。 – 2014-10-20 15:28:17

回答

1

我想补充一个多一对多的关系称为GRNinstance具有单个PO链路的单一GRN实例:

class PurchaseOrder(ndb.Models): 
    quantity = ndb.FloatProperty() 
    remaining = ndb.FloatProperty() 
    is_complete = ndb.BooleanProperty() 

class GRN(ndb.Models): 
    quantity = ndb.FloatProperty() 
    remaining = ndb.FloatProperty() 
    is_complete = ndb.BooleanProperty() 

class GRNinstance(ndb.Models): 
    po = ndb.KeyProperty(kind=PurchaseOrder) 
    grn = ndb.KeyProperty(kind=GRN) 
    quantity = ndb.FloatProperty() 

GRNinstance.quantity特定po总和加起来应该PurchaseOrder.quantity,和总和GRNinstance.quantity对于特定的grn应加起来为GRN.quantity

事实上,德米特里的ComputedProperty可以代替PurchaseOrder.quantityGRN.quantity(但这可能会很慢)。也许is_complete可能是一个简单的测试:

is_complete = ndb.ComputedProperty(lambda self: self.remaining > 0) 
+0

太棒了!实际上我采用了类似的方法,用第三张表格来建立两种关系。非常感谢,你的回答给了我信心,我正在正确的轨道上。 – 2014-10-31 21:19:41