2013-04-20 31 views
0

我對ndb相當陌生,但我已經瞭解到我需要重新連接大腦中的某個區域來創建模型。我試圖創建一個簡單的模型 - 只是爲了理解如何設計一個ndb數據庫 - 以一對一的關係:例如,用戶和他的信息。周圍有很多搜索後 - 發現的文件,但它是很難找到不同的例子 - 和經驗中(建模和在幾個不同的方式查詢),這是我找到了解決辦法:與KeyProperty一對一NDB建模

from google.appengine.ext import ndb 

class Monster(ndb.Model): 
    name = ndb.StringProperty() 

    @classmethod 
    def get_by_name(cls, name): 
     return cls.query(cls.name == name).get() 

    def get_info(self): 
     return Info.query(Info.monster == self.key).get() 

class Info(ndb.Model): 
    monster = ndb.KeyProperty(kind='Monster') 
    address = ndb.StringProperty() 

a = Monster(name = "Dracula") 
a.put() 

b = Info(monster = a.key, address = "Transilvania") 
b.put() 

print Monster.get_by_name("Dracula").get_info().address 

NDB沒有按」 t接受連接,所以我們想要的「連接」必須使用類方法和屬性來模擬。通過上述系統,我可以通過第一個數據庫中的唯一屬性(本例中爲「名稱」 - 假設沒有兩個具有相同名稱的怪物)輕鬆地到達第二個數據庫(Info)中的屬性。

但是,如果我想要打印一個包含100個怪物名稱和相應地址的列表,第二個數據庫(Info)將被擊中100次。

問題:有沒有更好的方法來模擬這個來提高性能?

回答

0

如果它真的是一對一的關係,爲什麼要創建2個模型。考慮到你的例子,地址實體不能與任何怪物共享,所以爲什麼不把地址細節放在怪物中。

有一些原因,你不會。當你只需要一對夫婦

  1. 地址可能變大,因此效率較低檢索屬性100的 - 儘管項目查詢可以幫助那裏。

  2. 你改變了主意,你想看到所有住在特蘭西瓦尼亞的怪物 - 在這種情況下,你將創建地址實體,怪物將擁有指向地址的關鍵屬性。當你計算出一些怪物可以生活在多個地方時(Werewolfs - 倫敦,特蘭西瓦尼亞,紐約;-),這種情況顯然會失敗,在這種情況下,你要麼在重複中有重複的KeyProperty,要麼指向怪物的中間實體地址。在你的情況,我不認爲,從整體上看怪物有許多記載地址;-)

此外,如果你是唯一的名稱標識的怪物,你應該考慮將名稱作爲關鍵字的一部分。做一個Monster.get_by_id(「德古拉」)比按名稱查詢更快。

正如我在評論中寫的(很差)。如果1以上成立,並且這是一對一的關係。在創建地址時,我將創建Address作爲子實體(Monster是密鑰中的父/祖)。這允許您,

  1. 允許其他實體指向的地址,
  2. 如果你創建了一堆孩子的實體,具有單 祖先查詢獲取它們)。 3如果你已經得到了怪物並且它再次擁有實體 這是一個祖先查詢。
  3. 如果你有一堆的實體是 應該只存在,如果怪物實例是否存在,他們不是 孩子,那麼你必須做的所有實體類型與 KeyProperty的匹配關鍵querys,如果論文實體不是 PolyModels,那麼你必須要對每個實體 類型的查詢(和知道你需要在給定的實體, 涉及某種類型的註冊表,或硬編碼的東西進行查詢)
+0

「@Tim」謝謝你的答案。原因1是正確的。信息會變大,我會添加許多其他屬性,如怪物的城市,國家,電話號碼等,而且我不需要每次查詢Monster。我會將其他模型鏈接到它們,並提供像last_appearance,eat_people(boolean)這樣的信息。我不會將名稱存儲爲密鑰的一部分,因爲我希望能夠更改它(例如某些網站中的用戶名)。但是,我也可以添加'name'屬性不能更改的規則,並且必須是唯一的。 – 2013-04-20 13:42:36

+0

好吧,鑑於此,我將地址作爲子實體(在構建時指定怪物是父親,可能帶有已知密鑰名稱)。它已經知道與怪物存在的業務,其他實體可以直接參考它。這可能是一大堆子實體,你可以用一個祖先查詢來獲取。 – 2013-04-20 23:29:18

+0

好的蒂姆,太棒了!由於我對ndb很陌生,而且文檔中缺少實際示例,您是否會如此友善地向我展示代碼?我一直在使用交互式控制檯玩兒童/父母關係,但我沒有辦法,我不太清楚它是如何工作的。謝謝! – 2013-04-21 01:53:46

0

我懷疑你可能試圖通過使用以下鏈接中描述的元素來實現 有一看「爲Expando模型」,「型號掛鉤」

https://developers.google.com/appengine/docs/python/ndb/entities

「上的多個按鍵或實體操作」(這可能更多的是比一個答案評論)

+1

好的,所以我有一對一的關係,我想從兩個模型中檢索具有屬性的列表。那最好的模式是什麼?有很多方法可以做到這一點,Tim(上文)已經表示,使用ID來檢索實體比查詢要快。你看,我想念的是帶有常見模式的ndb文檔。 – 2013-04-20 16:08:41