2011-06-29 9 views
2

に質問を参加者には、このモデルを見てみましょう:Googleのアプリエンジン - ユーザー、リストおよび製品A effiency

User 
    - name 

Product 
    - name 
    - category 

List 
    - name 
    - creation_date 
    - user (reference) 

Product_List 
    - list (reference) 
    - product (reference) 

は、どのように私は、リストの外に残っている製品のリストを取得することができますか?

  • 私はそれらすべてを取得し、プログラム的にそれらを削除する必要があります(これは遅く要求をしない?)

    1. は、特定のユーザーの特定のリストのすべての製品
    2. をゲットすべての製品
    3. 違いエキス(のための入れ子になったの?)

申し訳ありませんが、私はこれについて初心者です。提案やコメントは大歓迎です!

ありがとうございます!

+0

特定のユーザーのLIstのリストを取得し、各リストのすべてのproduct_listを取得する方法はありますか。次に、商品のリストを得ることができます –

+1

また、db.referenceプロパティのcollection_nameを利用することができます。 appengineのモデリングの詳細については、http://daily.profeth.de/2008/04/er-modeling-with-google-app-engine.htmlを参照してください。 –

+0

ありがとう@Abdul、このリンクはかなり役に立ちました。私は親切ですいくつかの関係を理解するのに役立ちます –

答えて

2

あなたはこのようなあなたのデータを構造化した場合:

class Product(db.Model): 
    # ... 

class UserInfo(db.Model): 
    # ... 

class ProductList(db.Model): 
    owner = db.ReferenceProperty(UserInfo) 
    products = db.ListProperty(db.Key) 

その後、あなたはこのようなリストの製品ではなく取得することができます。

product_keys = set(Product.all(keys_only=True).fetch(1000)) 
product_list = ProductList.get_by_id(product_list_id) 
missing_products = product_keys - set(product_list.products) 

missing_productsは、あなたが渡すことができますキーのセットであり、 db.getに送信して、対応する製品エンティティを取得します。

これは、もちろん、製品のリスト全体を取得する必要がありますが、これはまさにリレーショナルデータベースがクエリを満たすために必要なことです。

+0

うわー、私はあなたがセットを引くことができるか分からなかった!この言語は毎日私を驚かせます。 +1の情報私はすぐにそれを試してみましょうthx @ニック! –

0

この特定のクリーンアップジョブでは、map reduceジョブを使用して、Product_Listsのセットをスキャンできます。

将来、このような状況が発生しないようにしてください。たとえば、各リストをエンティティグループにすることができます。また、リストを削除すると、同じトランザクション内の関連するProduct_Listsもすべて削除します。代わりにProduct_Listsを完全に削除し、Listエンティティ自体にlist propertyを使用するだけです。

通常、結合の欠如はスケーラビリティのために犠牲にしなければならないことです。多くの結合は、データセット全体がローカルメモリにある場合にのみ効率的です。そのため、単一のサーバーに収まらない大きすぎるデータベースを作成したら、常に結合を犠牲にする必要があります。これは、スキーマが大幅に変更されたり、一部の操作がバッチ・ジョブに変更されたりすることを意味します。 GAEを使用するだけで、後で時間を押さえたときではなく、簡単に設計変更を行うことができます。

+0

その音から、OPはユーザーのリストにないすべての製品のリストを取得しようとしています_対応する製品を持たない 'Product_List'の項目はありません。 @ Xavi - それは正しいですか? –

+0

@Nick絶対的に正しいですが、上記の例は、私がGAEで使用することができないジョインを使用できるケースの1つです。 –

関連する問題