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

ただし、1つの質問のみ。エンティティグループはどこにこのすべての要因ですか?製品とレビューとユーザーが同じエンティティグループ(提案しているもの)にない場合、結果が矛盾する可能性はありませんか?これを防ぐ方法はありますか? –

関連する問題