0

我正在使用Google App Engine製作產品評論服務,而且我很好奇如何構建我的數據存儲模型(我正在使用「高度複製」設置,並且我已經收集了您的結構實體和他們的祖先非常重要)。特別是,我想知道使用密鑰列表(或者如果我應該使用祖先/父母來代替)。我的基本模式是這樣的:產品評論的GQL數據存儲模型 - 密鑰列表?或祖先?

-------------   
- Product - 
-------------  ---------- 
- [reviews] - ----> - Review - 
-   - /----------  ------------- 
------------- | - author - ---> - User - 
       | -  -  ------------- 
       | ----------  - [reviews] - --| 
       |     -   - | 
       |     ------------- | 
       |         | 
       -------------------------------------- 

正如你所看到的,每個產品包含的評論列表,並且每個用戶帳戶還包含由用戶發表的評論列表。我的主要問題是關於這些評論列表以及是否最好將它們存儲爲審閱密鑰列表,或者最好是使用查詢即時生成它們。

看來,對於與給定產品評論列表,做的最好的事情可能是創建審查實體給定產品的孩子,然後就創建,評論列表-fly當我需要使用它的祖先查詢,如:

reviews = db.GqlQuery("SELECT * " 
         "FROM Review " 
         "WHERE ANCESTOR IS :1 " 
         "ORDER BY date DESC LIMIT 10", 
         product_key) 

然而,爲獲得給定用戶發表的評論列表,我不能想辦法做到同上。看起來我必須存儲與用戶編寫的每個評論相關的密鑰列表。它是否正確?如果是這樣,在GAE數據存儲中存儲密鑰列表的最佳方式是什麼?

任何幫助或洞察這種情況下,因爲它涉及GAE數據存儲和/或一般數據庫設計將不勝感激。一般來說,我對數據庫設計相當陌生,所以越多越好。謝謝!

回答

1

我會建議不要這樣做 - 而是使用外鍵。如果「評論」對產品及其編寫的產品有db.ReferenceProperty,您可以輕鬆獲取產品的所有評論(Product.review_set.all()),用戶撰寫的所有評論(User.review_set.all()),以及產品和用戶的評論評論。

+0

謝謝!我在與您的建議相關的文檔中找到了這篇文章。這是關於建模實體關係的一般讀法。 http://code.google.com/appengine/articles/modeling.html –

+0

但是,只有一個問題。實體羣體在哪裏考慮所有這些因素?如果產品和評論與用戶不在同一個實體組中(這就是您建議的內容),那麼結果會不一致嗎?有沒有辦法來防止這種情況? –