我對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次。
問題:有沒有更好的方法來模擬這個來提高性能?
「@Tim」謝謝你的答案。原因1是正確的。信息會變大,我會添加許多其他屬性,如怪物的城市,國家,電話號碼等,而且我不需要每次查詢Monster。我會將其他模型鏈接到它們,並提供像last_appearance,eat_people(boolean)這樣的信息。我不會將名稱存儲爲密鑰的一部分,因爲我希望能夠更改它(例如某些網站中的用戶名)。但是,我也可以添加'name'屬性不能更改的規則,並且必須是唯一的。 – 2013-04-20 13:42:36
好吧,鑑於此,我將地址作爲子實體(在構建時指定怪物是父親,可能帶有已知密鑰名稱)。它已經知道與怪物存在的業務,其他實體可以直接參考它。這可能是一大堆子實體,你可以用一個祖先查詢來獲取。 – 2013-04-20 23:29:18
好的蒂姆,太棒了!由於我對ndb很陌生,而且文檔中缺少實際示例,您是否會如此友善地向我展示代碼?我一直在使用交互式控制檯玩兒童/父母關係,但我沒有辦法,我不太清楚它是如何工作的。謝謝! – 2013-04-21 01:53:46