2013-09-23 30 views

回答

2

這正是不能用對App Engine數據存儲做的事情。它不是一個關係數據庫,您不能將它作爲一個查詢。這意味着它不支持JOIN,你不能跨越實體類型進行查詢。

因此,在創建數據模型時遵循完整的規範化形式通常不是一個好主意。除非你有足夠的理由將它們分開,否則ContactInfo幾乎肯定會與Owner一起合併。您可能還需要定義一個記錄books_owned對業主重複的ReferenceProperty:那麼你可以做一個簡單的查詢和一些得到把所有的書:

owners = db.Query(Owner).filter('zipcode', 12345) 
books = [] 
for owner in owners: 
    book_ids.extend(owner.books_owned) 
books = db.get(book_ids) 

編輯領域是這樣的:

class Owner(db.Model): 
    ... 
    books_owned = db.ListProperty(db.Key) 

如果更新模式,現有實體不會發生任何事情:您將需要通過它們(可能使用遠程API)並更新它們以添加新數據。但請注意,您可以直接設置屬性,不需要執行數據庫遷移。

+0

謝謝。你能否解釋記錄books_owned的所有者上的重複ReferenceProperty上的位? – morpheus

+0

如果我按照您的建議進行架構更改,那麼數據存儲區中現有實體會發生什麼變化? – morpheus

+0

添加此評論的完整性。我認爲所有者不需要books_owned屬性。正如https://developers.google.com/appengine/articles/modeling的One to Many部分所述,由於Book對所有者具有ReferenceProperty,因此所有者可以反向引用其擁有的所有圖書。 – morpheus

0

如果聯繫信息是一個獨立的模型,你首先需要找到所有ContactInfo實體zipcode == 12345,然後找到所有引用的Owner實體那些ContactInfo實體,然後找到所有引用這些實體的Book實體。

如果您仍然能夠改變你的模型定義的話,那很可能是明智的Owner模型進行非規範化至少ContactInfo,可能還有Owner每個Book內。

相關問題