2013-09-25 80 views
0

我有這樣一個模型:谷歌AppEngine上:使複雜的查詢

class Person(db.Model): 
    ... 
    zipcode = db.StringProperty() 

class Book(db.Model): 
    owner = db.ReferenceProperty(Person) 
    date_created = db.DateTimeProperty(auto_add=True) 

我怎樣才能得到的某些郵政編碼內所有的書由date_created降序排序列表?

回答

1

以格雷格的答案又進了一步,在App Engine上的數據存儲將是正確的事情進行非規範化:

class Person(db.Model): 
    ... 
    zipcode = db.StringProperty() 

class Book(db.Model): 
    owner = db.ReferenceProperty(Person) 
    date_created = db.DateTimeProperty(auto_add=True) 
    zipcode = db.StringProperty() 

你必須要小心,當你設置的所有者設定書籍的郵政編碼。之後,將查詢作爲單個查詢進行查詢非常簡單。 Greg的解決方案成本更高,因爲您需要執行多個查詢並獲取許多實體來執行合併。對於大型數據集,速度也很慢,並且您會冒險執行各種提取操作,以及合併操作花費很長時間和大量內存。

0

您將不得不爲所有使用您正在查找的郵編的Person實體進行查詢,然後查找他們的每本書籍,合併列表並對結果進行排序。

一般來說,像使用關係數據庫那樣進行規範化並不是用數據存儲建模的最佳方法。