在數據存儲區我有了參考Owner
具有參考ContactInfo
具有財產zipcode
它的實體Book
。我想查詢某個郵編內的所有書籍。我怎樣才能做到這一點?我明白我不能寫一個查詢在那裏我可以這樣做:谷歌應用程序引擎:數據存儲區查詢在WHERE子句點參考屬性
q = db.Query(Book).filter('owner.contact_info.zipcode =', 12345)
在數據存儲區我有了參考Owner
具有參考ContactInfo
具有財產zipcode
它的實體Book
。我想查詢某個郵編內的所有書籍。我怎樣才能做到這一點?我明白我不能寫一個查詢在那裏我可以這樣做:谷歌應用程序引擎:數據存儲區查詢在WHERE子句點參考屬性
q = db.Query(Book).filter('owner.contact_info.zipcode =', 12345)
這正是不能用對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)並更新它們以添加新數據。但請注意,您可以直接設置屬性,不需要執行數據庫遷移。
如果聯繫信息是一個獨立的模型,你首先需要找到所有ContactInfo
實體zipcode == 12345
,然後找到所有引用的Owner
實體那些ContactInfo
實體,然後找到所有引用這些實體的Book
實體。
如果您仍然能夠改變你的模型定義的話,那很可能是明智的Owner
模型進行非規範化至少ContactInfo
,可能還有Owner
每個Book
內。
謝謝。你能否解釋記錄books_owned的所有者上的重複ReferenceProperty上的位? – morpheus
如果我按照您的建議進行架構更改,那麼數據存儲區中現有實體會發生什麼變化? – morpheus
添加此評論的完整性。我認爲所有者不需要books_owned屬性。正如https://developers.google.com/appengine/articles/modeling的One to Many部分所述,由於Book對所有者具有ReferenceProperty,因此所有者可以反向引用其擁有的所有圖書。 – morpheus