GQL-запрос для эффективного охвата сущностных отношений - PullRequest
0 голосов
/ 29 ноября 2008

Я нахожусь в ситуации, когда мне нужно охватить отношения сущностей Google App Engine в запросе, подобном в модели базы данных Django . Я использую ListProperty s для отношений один-ко-многим, например:

class Foo(db.Model): bars = db.ListProperty(db.Key)
class Bar(db.Model): eggs = db.ListProperty(db.Key)

И я хотел бы выполнить запрос, который выполняет следующее:

# Foo.filter('bars.eggs =', target_egg)
[foo
for egg in eggs if egg == target_egg
for eggs in bar.eggs
for bar in foo.bars
for foo in Foo.all()]

Понимание кажется совершенно неэффективным. Я действительно хотел бы выполнить запрос, как в закомментированной части, но он не выглядит как синтаксис GQL , позволяющий выполнять запросы к атрибутам атрибутов:

   SELECT * FROM <kind>
    [WHERE <condition> [AND <condition> ...]]
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]]
    [LIMIT [<offset>,]<count>]
    [OFFSET <offset>]

  <condition> := <property> {< | <= | > | >= | = | != } <value>
  <condition> := <property> IN <list>
  <condition> := ANCESTOR IS <entity or key>

1 Ответ

3 голосов
/ 29 ноября 2008

Вы правы, хранилище данных App Engine не допускает такого рода запросов. И вы правы, что понимание списка неэффективно. Тем не менее, учтите, что это почти то же самое, что делает реляционная база данных, когда вы выполняете запрос с объединениями, подобными вашей - база данных должна выполнять ту же самую O (n ^ 3) работу, которую вы делаете здесь - единственное отличие состоит в том, что что вы делаете это в Python, и с дополнительным временем поездки туда и обратно. Поскольку App Engine разработан для масштабирования, он не предназначен для такого рода запросов.

Обычно, однако, есть способ, которым вы можете немного денормализовать вашу модель, чтобы облегчить это, перемещая некоторые свойства, к которым вы хотите получить доступ, в модель Foo, или, если вы делаете агрегаты, перемещая итог на Foo модель. Однако трудно дать конкретные решения, не имея представления о том, какую проблему вы пытаетесь решить.

...