1

從傳統關係數據庫遷移到非關係數據庫(如App Engine數據存儲區)時,如何正確進行數據建模存在大量問題。Google App Engine數據存儲建模問題

我已經多次閱讀NDB官方文檔,並在互聯網上嘗試了幾個教程,但是,我仍然陷入困境。

我正在開發一個財務應用程序,它可以記錄我所有的個人開支。這意味着我設計了一個名爲Expense的實體,其中包含一些屬性。作爲費用的一部分,我還設計了一個供應商實體來存儲與商家相關的信息。

下面是執行:

class Expense(ndb.Model): 
    amount = ndb.FloatProperty(required=False) 
    description = ndb.StringProperty() 
    vendor = ndb.KeyProperty(kind=Vendor) 

class Vendor(ndb.Model): 
    companyName = ndb.StringProperty(required=False) 
    friendlyName = ndb.StringProperty(required=False, default="") 

這是爲了獲取消費信息的代碼:

def get(self): 
    template_page = "expense.html" 
    template_values = {'expense':Expense.query()} 

    self.renderTemplatePage(template_page, template_values) 

我的設計面臨的問題上面是如何中檢索費用和供應商信息並把它傳遞給JINJA來渲染它。正如我所料,Expense類中的Vendor屬性只是一個Key而不是對象本身。所以JINJA無法理解表達式{{expense.vendor.friendlyName}}

雖然這個問題似乎是技術性的,但我相信我的智慧與非關係數據庫的概念以及我應用於傳統類型的設計有關解決方案。

另一種方法是使用StructuredProperty而不是KeyPrperty。但是,一個解決方案要求是能夠重命名供應商友好名稱,並且這會影響所有現有費用。追蹤每個建築物並找出變化是瘋狂的。

在放棄App Engine並轉移到Google Cloud SQL之前,我想聽一些關於如何解決這個數據建模場景的建議。也許我不建議在非關係型數據庫中使用我需要構建的解決方案。

Thansk對此有任何支持。

回答

2

在模板中,你可以這樣做:

{{ expense.vendor.get().friendlyName }} 

或者你可以將屬性添加到您的模型:

class Expense(ndb.Model): 
    amount = ndb.FloatProperty(required=False) 
    description = ndb.StringProperty() 
    vendor = ndb.KeyProperty(kind=Vendor) 

    @property 
    def vendor_name(self): 
     return self.vendor.get().friendlyName 

這將允許在你的模板:

{{ expense.vendor_name }} 

要停止這樣做效率低下,您可以在顯示費用清單前撥打供應商,撥打電話get內循環只是本地內存查找:

def get(self): 
    template_page = "expense.html" 
    expenses = Expense.query().fetch() 
    ndb.get_multi([e.vendor for e in expenses]) 
    template_values = {'expense':expenses} 

    self.renderTemplatePage(template_page, template_values) 
+0

感謝您的幫助,格雷格。非常感激! 這兩種方法都很好。 現在,就設計而言,這究竟是怎麼回事?我將向費用實體添加更多KeyProperty,例如類別和付款。 我仍然需要改變我對非關係數據庫數據建模的想法。我不清楚何時選擇其中一種或其他數據庫技術。 –

+0

@FabioMoggi與ndb關係的討論:http:// stackoverflow。com/q/14739044/584846 –

+0

感謝提示@BrentWashburne –

相關問題