2012-10-01 2 views
3

정렬 :여러 쿼리 대 수동으로 같은 모델의 하나 개의 큰 쿼리 (AppEngine에 NDB)

class Thing(ndb.Model): 
    visible = ndb.BooleanProperty() 
    made_by = ndb.KeyProperty(kind=User) 
    belongs_to = ndb.KeyProperty(kind=AnotherThing) 

은 기본적으로 그래서 나는 또는 내장 사용할 수없는 다른 속성을에 '또는'쿼리를 수행하지만, 비교 ... visibleTrue 또는 visible으로 설정되어있는 Thing (모두 특정 AnotherThing에 속함)이 False이고 made_by이 현재 사용자가되고 싶습니다. ,

  1. 쿼리가 모든 것을 얻을 즉 : 데이터 저장소에 덜 까다로운 것

    (즉, 재정적으로 적은 비용) Thing.query(Thing.belongs_to == some_thing.key)을하고 눈에 보이는 것들을 저장, 결과를 반복하고, 때로 믿을 사람 보이지 않지만 현재 사용자가 만든거야?

  2. Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "True")과 같이 현재 사용자가 보이지 않는 것을 얻으려면 즉, Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "True")을 쿼리하고 따로 쿼리하십시오 : Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "False", Thing.made_by = current_user)? 나는 많은 데이터 저장소의 읽고 생각 -

번호 1. 다른 사용자가 Thing 보이지 않는의 같은 많은 불필요한 결과를 얻을 것? 2. 두 개의 전체 쿼리가 있는데, 불필요하게 무거운 것일 수도 있습니다. 맞습니까? 나는 데이터베이스와 어떤 종류의 상호 작용이 어떤 종류의 비용을 야기하는지 아직도 고민하고있다.

필요한 경우 ndb, tasklets 및 memcache를 사용하고 있습니다.

+0

왜 OR을 사용할 수 없습니까? –

답변

3

2 개의 이유는 2 개의 이유 때문에 재정적으로 더 작을 것이다. 먼저 데이터 저장소 읽기와 반환 된 각 엔티티에 대해 쿼리에 대해 비용을 지불하므로 모든 데이터를 읽고 모든 데이터를 쿼리해야하는 첫 번째 쿼리에 대해 더 많은 비용을 지불하게됩니다. 당신이 필요로하는 것에 대해서만 지불하는 두 번째 방법.

둘째, 백엔드 또는 프론트 엔드 시간에 대한 대가를 치르고, 첫 번째 방법에서 모든 결과를 반복 할 때 시간을 사용합니다. 두 번째 방법에 시간을 할애하지 않아도됩니다.

첫 번째 옵션이 더 좋은 방법은 없습니다. https://developers.google.com/appengine/docs/billing

당신은 읽기, 읽고 씁니다을 위해 스몰가 추가하는 방법을 볼 수 있습니다 : (당신은 단지 몇 엔티티 ??이 어쩌면 경우)

읽기 및 질의 당신이에 조금 아래로 스크롤 비용 방법을 이해하려면 , 쓰기 및 쿼리.

나는 현재 사용자가 visible = false 대신 owner = current 대신 소유 한 것을 쿼리하기 때문에 시간을 절약 할 복합 인덱스가 필요하지 않습니다. 또한 일부 공간을 절약하는 부분 색인을 표시 할 수도 있습니다 (허위 색인을 요구할 필요가 없다고 가정 할 때만 색인을 생성합니다).중복을 제거하기 위해 litte 작업을 수행해야하지만, 그렇게 나쁜 것은 아닙니다.

2

실제 데이터를 사용하여 두 경우를 모두 벤치마킹하는 것이 가장 좋습니다. 전반적인 성능에 영향을 미칠 수있는 많은 미묘한 부분이 있기 때문에 추상적으로는 이런 것을 결정하기가 어렵습니다.

나는 옵션 2가 더 나을 것을 기대할 것이다. 당신이 신경 쓰지 않는 많은 수의 객체를로드하는 것은 단순히 데이터 저장소에 많은 부담을 가하게 될 것이므로 추가 질의를 비교할 수 없을 것이라고 생각합니다. 물론, 얼마나 많은 여분의 물건들에 달려 있느냐에 달려있다.