문제

나는 쿼리에 Google App Engine Entity 관계를 유지 해야하는 상황에 처해 있습니다. Django 데이터베이스 모델에서. 사용 중입니다 ListPropertySO와 같은 일대일 관계의 경우

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>
도움이 되었습니까?

해결책

맞습니다. App Engine Datastore는 이러한 종류의 쿼리를 허용하지 않습니다. 그리고 당신은 목록 이해력이 비효율적이라는 것이 옳습니다. 그러나 그것이 당신의 쿼리를 사용하여 쿼리를 실행할 때 관계형 데이터베이스가하는 것과 거의 정확히 일치한다는 것을 고려하십시오. 데이터베이스는 동일한 O (n^3) 작업을 수행해야합니다. 유일한 차이점은 유일한 차이점입니다. 당신은 파이썬에서 그리고 추가 왕복 시간으로 그것을하고 있습니다. App Engine은 스케일로 설계되었으므로 실제로 이러한 종류의 쿼리를 위해 만들어지지 않습니다.

그러나 일반적으로 FOO 모델에 액세스하는 데 필요한 일부 속성을 이동하거나 총계를 FOO 모델로 이동하여 골재를 수행하는 경우 모델을 약간 촉진 할 수있는 방법이 있습니다. 그래도 해결하려는 문제에 대한 아이디어가 없으면 구체적인 솔루션을 제공하는 것은 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top