2011-08-31 68 views
2

考慮下面的多對多的關係在谷歌App Engine數據存儲設計:GQL +加入表查詢替換爲谷歌App Engine數據存儲

用戶
PK:用戶名
名稱

公司
PK:公司ID
名稱

CompanyReview
CK CompanyID
CK用戶名 ReviewContent

爲了優化查詢,有什麼要查詢的顯示用戶所選擇的公司的審查這一關係表的最佳途徑。

目前,我做了以下內容:

results = CompanyReview.all().filter('owned_by = ', company).filter('written_by = ', user).fetch(10) 

在那裏我能找回CompanyReview表的數據。但是,在這種情況下,我需要根據用戶表檢查此CompanyReview表中的UserID,以獲取爲所選公司評論的用戶的名稱。

是否有一個更好的解決方案來獲取用戶名以及所有在這種情況下的聲明或至少更好的優化解決方案?表現強調。

回答

1

它依賴於關係的哪一方將具有更多的值。如描述的this article of Google App Engine docs,您可以使用關係的一側中的鍵列表來建模多對多關係。 「這意味着你應該把這個列表放在你期望值較少的關係一側」。

如果關係的兩邊都會有很多值,那麼您確實需要CompanyReview模型。但要注意的文章這樣說:

但是,你必須非常小心,因爲遍歷集合的 連接將需要對數據存儲更多的呼叫。 只有當您真的需要 時才使用這種多對多的關係,並小心地執行應用程序的性能。

這是因爲它使用RefereceProperty在關係模型:

class ContactCompany(db.Model): 
    contact = db.ReferenceProperty(Contact, 
            required=True, 
            collection_name='companies') 
    company = db.ReferenceProperty(Company, 
            required=True, 
            collection_name='contacts') 
    title = db.StringProperty() 

因此,如果跟實體,我們嘗試訪問該公司,它將使一個新的查詢。如果在ContactCompany實體中,我們嘗試獲取聯繫人的屬性,如contact_company.contact.name,那麼也將對該單個聯繫人進行查詢。閱讀ReferencyProperty docs瞭解更多信息。

額外: 由於您對性能的要求很高,所以我建議您使用decorator for memcaching function returns並將這個出色的layered storage library用於Google App Engine。

+0

感謝您的提醒...對於這種情況,是的,需要另一種模式。因爲公司和用戶都是自己的實體..所以,我們絕對需要另一個評論表來存儲評論的內容和細節。 也感謝您的額外有用的信息...;) 但是,再次highlighing感謝使用DbListProperty ..以及額外的信息! ;) – MrCooL

相關問題