2009-05-23 10 views
4

顧客とオーダーの2つのテーブルがあり、顧客の最新の注文を調べたい場合、GQLを使用してGoogle App Engineでこれをどのように行うのですか?Google App Engineでは、GQLで顧客の最新の注文をどのように調べますか?

通常、私はordersテーブルに存在する外部キーcustomer_idによってこれら2つのテーブルを結合します。

select orders.* from customers, orders 
where customers.customer_id = orders.customer_id 
and orders.order_id = (select top 1 sub_orders.order_id from orders sub_orders 
       where sub_orders.customer_id = orders.customer_id 
       order by sub_orders.order_date desc) 

しかし、Google App Engineでは結合が不可能なようであるため、この制限を回避する方法がわかりません。任意の提案をいただければ幸いです。

答えて

10

Google App Engineのデータストアは、リレーショナルデータベースとはまったく異なります。いくつかの類似点がありますが、データモデルを設計する際の違いを理解することが重要です。

class Customer(db.Model): 
    name = db.StringProperty() 

class Order(db.Model): 
    customer = db.ReferenceProperty(Customer, 
            collection_name = 'orders') 

Customerエンティティのプロパティの作成においてOrderエンティティ定義結果でReferenceProperty、名前の「受注」:

あなたは、通常このような関係を定義する方法は、参照プロパティを使用することです'customer'がCustomerインスタンスの場合、 'customer.orders'を参照してすべての注文を見つけることができます。例えば

customer = Customer.gql("WHERE name = :1", "Bob")[0] # Returns the first customer named Bob 
order1 = customer.orders[0] 
order2 = customer.orders.order("date")[0] # Sorts the Orders by date and gets the first one 

リファレンス性質を理解するためにhere.

もう一つの重要な概念を文書化されているエンティティグループの考え方です。エンティティグループのエンティティは同じノードに格納されるため、より効率的に格納および取得できます。また、トランザクションの使用にも重要です。

+0

うわー!これは最高です!ありがとう。 –

+0

order2 = customer.orders.order( "date")[0] ----ここでオーダーオブジェクトで呼び出されたオーダーメソッドに関して、そのメソッドに使用可能なオプションをすべて見つけるには最適な場所は何ですか?例えば、私はorder( "date asc")かorder( "date desc")と言うことができ、それを対応するGQLに変換することができますか? 1秒前 –

+0

エンティティグループまでは、リレーショナル世界では何が相当するでしょうか?私はあなたが "同じノードに格納されている"という意味を持っているかどうかは分かりません。 –

関連する問題