4

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

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

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 では結合ができないように見えるため、この制限を回避する方法がわかりません。任意の提案をいただければ幸いです。

4

1 に答える 1

10

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

通常、この種の関係を定義する方法は、参照プロパティを使用することです。

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

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

Order エンティティ定義の ReferenceProperty により、Customer エンティティに「orders」という名前のプロパティが作成されるため、「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

参照プロパティはここに記載されています。

理解すべきもう 1 つの重要な概念は、エンティティ グループの概念です。エンティティ グループ内のエンティティは同じノードに格納されるため、より効率的に格納および取得できます。また、トランザクションを使用するためにも重要です。

于 2009-05-23T21:41:28.907 に答える