4

如果我有两张表,Customers 和 Orders,并且我想查找客户的最新订单,我将如何使用 GQL 在 Google App Engine 上执行此操作?

通常,我会通过订单表中存在的外键 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

参考属性记录在这里。

另一个需要理解的重要概念是实体组的概念。实体组中的实体存储在同一节点上,因此可以更有效地存储和检索它们。它们对于使用交易也很重要。

于 2009-05-23T21:41:28.907 回答