2013-12-23 236 views
0

鑑於我在數據存儲中的以下實體:質疑的ReferenceProperty

class Owner(db.Model): 
    name = db.StringProperty() 
    age = db.IntegerProperty() 

class Pet(db.Model): 
    name = db.StringProperty() 
    owner = db.ReferenceProperty(Owner) 

和一些業主沒有寵物,如何最有效地提取誰擁有寵物全體業主,由業主年齡排序?我知道聯接是不可能的,所以看起來可能會有兩個查詢。

我試圖從寵物中提取所有的所有者鍵,然後用鍵做了'IN'查詢,但是我打了最多30個子查詢限制。

回答

2

我會爲Owner類添加一個或兩個屬性。

定義布爾字段owns_pets(或similiar),你當你添加的寵物,然後選擇所有業主那裏owns_pets == True,按年齡排序,然後取寵物使用反向組中的每個用戶設置爲True。

或者添加一個ListProperty pets,其中包含擁有Pets的所有密鑰。然後查詢所有所有者(再次使用上面的布爾值更容易),然後db.get(some_owner.pets)

沒有這些,你有一些不那麼簡單的方法。

通過Age集合中的所有者循環,獲取反向參考集(在您的案例中爲pet_set)跳過所有者,其中pet_set不返回任何內容。

其他方法包括獲取所有寵物,收集所有者的密鑰(在一個集合中,刪除重複項),然後db.get(所有者密鑰列表),然後在代碼中對它們進行排序 - 不如)如果你想使用這個路徑,看一下nick johnson預取參考集代碼http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine

真的最好的選擇是在寫入時開始存儲冗餘數據這使得經常使用的查詢執行起來更便宜。