0

나는 City ->District이며, City에 지정된 name이있는 경우 District을 찾아야합니다 (있는 경우).GAE : 특정 문서에서 참조되는 항목을 어떻게 쿼리합니까?

코드 : 나는이 작업을 수행하려면 어떻게

class City(ndb.Model): 
    districts = ndb.KeyProperty(kind=District, repeated=True) 

class District(ndb.Model): 
    name = ndb.StringProperty() 

?

+0

지구의 이름이 'Foo'인 특정 도시 기록을 원하십니까? – Anzel

답변

2

저는이 작업을 위해 스키마를보다 효율적으로 구성 할 수 있다고 생각합니다. 예를 들어, 도시를 선조로 만들고, 도시 이름이나 다른 고유 한 도시 ID를 사용하고, 다음으로 지구 이름을 사용하십시오. 각 지구가 검색 속도를 위해 도시를 중복 기록 할 수 있도록 스키마를 비정규 화하십시오.

그러나 이러한 최적화가 진행되는 데있어 다른 문제가있을 수 있습니다. 그것은 그 이름의 지역이 그 도시에없는 경우 비어 목록을 반환, 그렇지 않으면 아마도 (A 내에서 지역 이름을 단일 항목 가정 한 - 경우 성능은

def fetch_district_in_city(city, district_name): 
    query = District.query(ndb.AND(District.name == district_name, 
            District.key.IN(city.districts))) 
    return query.fetch() 

는 상당히 잘 작동 할 수 있습니다, 당신을 위해 만족 도시는 유일하다).

난이 (내가 위에서 언급 최적화 대안과 비교)을 완전히 충족 될 가능성을 고려하지 않는 이유는 https://cloud.google.com/appengine/docs/python/ndb/queries#neq_and_in에 설명 된대로 OR== 검사의 많은에 IN 방법 "폭발", , 지구가 많은 도시. 따라서 앱의 성능이 저하 될 수 있으며, 위에서 언급 한 최적화 (특히 키에 의존하는 앱, 매우 빠른 & light)를 사용하여 매우 가벼운 애플리케이션의 커튼 뒤에서 수행하는 작업량이 줄어들 수 있습니다.).

+0

좋은 점, 나는 OP가 정확히 원하는 것을 완전히 이해하지 못합니다. – Anzel

+0

@Anzel 그가 지구 단체를 원한다고 생각합니다. 이름과 도시 엔티티가 주어 졌다고 생각합니다. (물론 두 회사 모두 다른 속성이있을 것이고, OP는 해골을 보여줄 것입니다.) –

+0

고마워요 @AlexMartelli, 네 일단 당신의 질문을 보면 이해할 수있다. – Anzel

관련 문제