2011-11-18 2 views
0

의 내가, 웹 페이지가 PageModel에 의해 표현 될 수있는 웹 사이트를 모델링과 같이하고있어 가정 해 봅시다 :게으른 로딩 구글 앱 엔진에서 대형/복잡한 모델 속성을

class PageModel(db.Model): 
    name = db.StringProperty() 
    parentPage = db.SelfReferenceProperty() 
    content = db.TextProperty() 

내가 싶습니다 모든 페이지 개체의 목록을 가져올 수 있고 메뉴를 렌더링 할 수 있지만 모든 항목의 콘텐츠를 가져올 필요는 없습니다. 필요한 경우에만 내용을 가져올 수 있도록이 객체를 모델링하는 방법은 무엇입니까? 별도의 '콘텐츠'모델과 1 대 1 참조 관계가 필요합니까? 그렇다면 page 개체 또는 content 개체에 대한 참조를 만드시겠습니까?

답변

2

콘텐츠 속성을 새 모델 (PageContentModel)로 옮길 수 있습니다. PageContentModel의 부모를 PageModel (db.Model의 부모 속성 사용)으로 지정하여 참조를 구현합니다. 이렇게하면 단일 엔티티 그룹에있는 것처럼 단일 트랜잭션에서 두 개를 모두 수정할 수 있습니다. 합니다 (PageModel PageContentModel에 대한 참조를 가지고 반대) PageContentModel가 PageModel에 대한 참조를 필요로 모델링 가지의

이점 중 하나는 당신이 이제까지 1메가바이트보다 큰 만족해야하는 경우 각을 허용함으로써 그렇게 할 수 있다는 것입니다 PageModel에 1 개 이상의 PageContentModel 객체가 있고 내용을 1MB 청크로 분할하고 각 청크를 다른 PageContentModel 인스턴스에 쓰면됩니다. 컨텐트를 다시 얻으려면 PageContentModel 객체에 관련하여 "주문"속성이 있어야 컨텐트를 올바른 순서로 다시 빌드 할 수 있습니다. @Nick으로 컨텐츠를 작성하는 files api을 사용하는 것이 작업을 수행하는 다른 방법을 제안한 것처럼

PageContentModel.all().ancestor(page_model_instance) 

:

는이 같은 조상 필터를 사용하는 것 PageModel 관련된 PageContentModel 인스턴스에 대한 조회하려면 blobstore의 blob에 연결 한 다음 PageModel에 BlobReferenceProperty를 지정하여 해당 BLOB를 PageModel에 연결하십시오. 나는 이제 이것을 시도 할 수있는 기회를 얻었으며 실험적인 특징 임에도 불구하고 꽤 잘 작동하고있다. 이렇게하면 콘텐츠가 매우 커지고 새로운 가격 책정 모델에 따라 실제로 데이터 저장소 모델에 콘텐츠를 저장하는 것보다 비용이 적게 듭니다.

2012 년 2 월 7 일에서 blobstore에 대한 @Nick의 제안을 포함하도록 업데이트했습니다.

+0

좋은 아이디어 브라이스 - 감사 – Yarin

+0

괜찮습니다. 나는 각각의 잠재적 인 여러 메가 바이트의 콘텐츠를 가진 수천 개의 기사가있는 내 응용 프로그램 중 하나에서 이것을 정확히 수행하고 있습니다. 부모 모델의 일부였던 콘텐츠를 많은 수의 개체에 대해 쿼리 할 때마다 결과 개체가 소프트 메모리 한도를 초과하는 처리기를 밀었습니다. 콘텐츠를 하위 모델로 옮기면 내 메모리 사용량을 제정신으로 유지할 수 있었고 기사 당 훨씬 더 많은 콘텐츠를 저장할 수있었습니다. 단 하나의 기사를 보여주는 페이지의 내용 만 사용하기 때문에 그 페이지를 만들기위한 추가 쿼리가 그렇게 나쁘지는 않습니다. –

+0

굉장합니다 - 업데이트 해 주셔서 감사합니다. – Yarin