2012-09-02 1 views
0

NBD 클래스와 폴리 모델 클래스를 결합하려고합니다. 다음과 같은 문제를 고려할 때 "최선"방법을 명확히하는 데 도움이 될 것입니다.NBD와 폴리 모델 짝짓기

과일의 폴리 모델 (폴리 모델 계층 구조의 한 예인 Fruit -> Tree-Bearing -> Apples -> Granny Smith)을 다이어트라고하는 ndb.Model에 저장하려고합니다. 그래서 분명히 과일 카테고리, 야채 카테고리 등이 있습니다. 어떻게 구성해야합니까?

지금까지 내가 가진 :

class Diet(ndb.Model): 
    nameOfDiet = ndb.StringProperty() 
    fruit = ndb.StructuredProperty(Fruit) 
    vegetable = ndb.StructuredProperty(Vegetable) 

문제를이와 - 나는 내가 제대로 읽기 다이어트의 과일과 야채 오브젝트가 있다는 것이다하고 생각하는 "비 쿼리 가능." 분명히 사용자가 특정 과일에 맞는 다이어트를 검색 할 수 있기를 바랍니다. 또한 ndb의 캐싱 기능을 이용하기를 원합니다. 내가 어떻게 모든 할머니 스미스 다이어트를 원한다면 아무 것도없는 값을 반환하지 않고 얻을 수 있도록 과일을 효율적으로 쿼리 할 수 ​​있습니다. 게다가 NDB로 폴리 모델을 만들 수 있습니까? 그렇지 않다면, 나는 과일의 구조를 어떻게 A)로 바꿀 것인가? 내가 원하는 것과 일치하고 B) 적어도 명목상으로 효율적입니까?

감사합니다. Jon

+0

사용자가 계층에 새 과일을 추가 할 수 있습니까? –

답변

3

이 경우에는 polymodel을 사용할 필요가 없습니다. 과일의 계층 구조가 포함 된 과일의 목록 속성을 사용할 수 있습니다.

class Diet(ndb.Model): 
    name = ndb.StringProperty() 
    fruit = ndb.StringProperty(repeated=True) 
    vegetable = ndb.StringProperty(repeated=True) 

과일 속성은 [ '트리 - 베어링', '사과', '그래 니 스미스', '트리 - 베어링', '사과'를 포함 할 수있다 '골든 맛있는', '트리 - 베어링', ' 오렌지'].

results = Diet.query(Diet.fruit == 'Apples').fetch(20) 

을 아니면 '사과'와 '오렌지'를 포함하는 음식을 찾으려면 당신은 IN 쿼리를 사용할 수 있습니다 : 당신이 '사과'로 다이어트를 찾으려면 그런 다음 다음을 수행 할 수 있습니다.

results = Diet.query(Diet.fruit.IN(['Apples', 'Oranges']) 

예를 들어, 당신은 과일의 각 작업에 필요한 자세한 사항이있는 경우 : 당도, 계절 등, 당신은 KEY_NAME이 과일의 이름입니다 과일을위한 모델을 만들 수 있습니다 (그것을 확인하기 과일에 대한 데이터를 빠르게 가져올 수 있음). 과일 모델은 필요할 경우 부모의 계층 구조를 포함 할 수 있습니다.

class Fruit(ndb.Model): 
    name = ndb.StringProperty() 
    sugar_content = ndb.FloatProperty() 

'골든 딜리셔스'에 대한 자세한 내용을 보려면 키를 작성하고 데이터를 가져 오십시오. 데이터를 가져 오는 것은 Map 함수를 사용하여 비동기 적으로 수행 할 수 있습니다. 키로 이동하면 데이터도 캐시되므로 이후에 가져 오는 키는 곧바로 memcache에서 가져옵니다.

gd =ndb.Key("Fruit", "Golden Delicious").get() 

또 다른 옵션 : 저장 (현재했던대로) 구조화 된 속성으로 과일 객체 만 반복 구조적 속성을 확인하십시오.약간 들어 https://developers.google.com/appengine/docs/python/ndb/polymodelclass

:

class Diet(ndb.Model): 
    name = ndb.StringProperty() 
    fruit = ndb.StructuredProperty(Fruit, repeated=True) 
쿼리 당신의 다이어트 모델의 구조적 특성에 유사한 방법으로 수행 될 수

:

results = Diet.query(Diet.fruit.name == 'Orange') 

마지막으로는, polymodels는 NDB에 가능하며, 참조 데이터를 비동기 적으로 가져 오는 방법에 대한 정보는 다음을 참조하십시오. https://developers.google.com/appengine/docs/python/ndb/async

+0

하나의 추가 구성 요소가 있습니다. 예를 들어, 나무를 가진 과일을 포함하는 모든 다이어트를 계산하려면 어떻게해야합니까? – Jon

+0

일반적으로 계산은 엔티티 작성시 가장 잘 수행됩니다. 그래서 누군가가 나무 열매를 맺는 식단을 만들면 카운터를 증가시킵니다. 나무에 열매를 맺는 과일이 몇 마리 있는지 알아 보려면 간단히 카운트를 가져와야합니다. 매초마다 두 가지 이상의 다이어트가 만들어 질 것으로 의심되는 경우 카운터에 샤딩을 사용하는 것이 좋습니다. https://developers.google.com/appengine/articles/sharding_counters –