2009-07-09 3 views
19

엔티티 그룹이 GAE의 스토리지에서 작동하는 방식에 대한 모든 정보를 알고 있지만 어제 (Palo Alto의 App Engine meetup에서) 발표자가 엔티티 그룹의 사용을 설명하면서 어쩔 수없이 사용하지 않았다는 것을 알았습니다. 내 자신의 GAE 애플 리케이션에서 그들 중, 그리고 나는 그들이 사용했던 오픈 소스 GAE 애플 리케이션에서 사용되는 것을 기억하지 않습니다.App Engine에서 엔티티 그룹을 사용하는 오픈 소스 사례가 있습니까?

그래서 나는 단순히 "사용중인 엔티티 그룹"을 "해결되는 종류의 문제"에 즉각적으로 연결하는 데 익숙하지 않았기 때문에 그러한 예제를 간과하거나 기억하지 않는 것으로 의심합니다. - 나는이 목표를 염두에두고 이러한 소스를 연구함으로써 EG 사용 문제를 해결하는 데 초점을 맞추어야한다고 생각합니다 (즉, 앱이 왜 작동하지만 작동하지 않거나 제대로 작동하지 않는 이유). 그것).

누구나 그런 코드에 좋은 URL을 제안 할 수 있습니까? (에세이도 응용 프로그램 수준의 문제 해결에 초점을 맞추면 환영할만한 내용이지만 이 아니라면은 대부분 내가 본 것처럼 EG가 작동하는 방식에 초점을 맞 춥니 다.

답변

22

엔티티 그룹의 주요 용도는 트랜잭션에서 둘 이상의 엔티티를 업데이트하는 수단을 제공하는 것입니다.

사용하지 않았다면 축복을 계산하십시오. 어느 하나의 엔티티가 일관성을 유지하기 위해 동시에 업데이트 할 필요가없는 데이터 모델을 설계했거나 그렇지 않으면 필요하지만 운이 좋았습니다.

내가 가지고 있다고 상상해보십시오. 송장 엔티티 유형 및 LineItem 엔티티 유형이 있습니다. 하나의 인보이스에는 여러 개의 LineItem이 연결될 수 있습니다. My Invoice 엔티티에는 LastUpdated라는 필드가 있습니다. LineItem이 내 송장에 추가 될 때마다 LastUpdated 필드에 현재 날짜를 저장하려고합니다.

내 업데이트 기능이 (의사)처럼 보일 수 있습니다 송장 넣어()가 성공하고 LINEITEM 넣어()가 실패 할 경우

invoice.lastUpdated = now() 
lineitem = new lineitem() 

invoice.put() 
lineitem.put() 

은 어떻게됩니까? 인보이스 날짜에 무언가가 업데이트 되었음이 표시되지만 실제 업데이트 (새 LineItem)는 표시되지 않습니다. 해결책은 puts()를 트랜잭션 내부에 넣는 것입니다.

대체 솔루션은이 데이터를 lastUpdated 필드에 저장하는 대신 마지막으로 삽입 된 LineItem의 날짜를 찾기 위해 쿼리를 사용하는 것입니다. 하지만 라인 입력이 마지막으로 추가 된 시간을 알기 원할 때마다 인보이스와 모든 LineItem을 가져와 귀중한 데이터 스토어 할당량이 필요합니다.

편집은 포스터의 코멘트

아에 응답 할. 나는 당신의 혼란을 이해한다고 생각합니다. 위의 단락은 거래가 중요한 이유를 설명합니다. 그러나 엔티티 그룹이 트랜잭션과 어떤 관련이 있는지 알지 못하기 때문에 엔티티 그룹에 대해서는 신경 쓰지 않는다고 말합니다. 그러나 db.run-in-transaction을 사용하고 있다면 엔티티 그룹을 사용하고 있습니다. 모든 거래는 하나의 엔티티 그룹 만 포함하며, 주어진 거래는 동일한 그룹에 속한 엔티티에만 영향을 줄 수 있습니다. here

"는 트랜잭션의 모든 데이터 저장소 작업이 같은 엔티티 그룹의 실체 에 작동해야"을 참조하십시오.

거래 내에서 어떤 행동을 하시나요? 하나의 엔티티와 트랜잭션을 사용하는 데는 여러 가지 이유가 있습니다. 하나의 엔티티는 기본적으로 자체 엔티티 그룹에 있습니다.그러나 위의 예와 같이 두 개 이상의 항목을 동기화해야하는 경우가 있습니다. Invoice와 LineItem Entities가 같은 엔티티 그룹에 없다면 db.run-in-transaction 호출에서 수정 사항을 래핑 할 수 없습니다. 따라서 언제든지 두 개 이상의 엔티티를 트랜잭션 방식으로 조작하려는 경우 먼저 동일한 그룹에 있는지 확인해야합니다. 희망은 그들이 왜 유용한지를 더욱 분명하게 만듭니다.

+1

거래에 db.run_in_transaction (http://code.google.com/appengine/docs/python/datastore/functions.html 참조)을 사용했습니다 (물론 해당 특수 사례의 경우 get_or_insert를 참조하십시오. http : //code.google.com/appengine/docs/python/datastore/transactions.html) - 엔티티 그룹의 이점은 무엇입니까? –

+1

오우! 내 첫 downvote. 트랜잭션에 대한 엔티티 그룹 wrt의 장점은 트랜잭션이 엔티티 그룹 외부에서 작동하지 않는다는 것입니다. 트랜잭션을 사용했다면 암시 적으로 만 엔티티 그룹을 사용했습니다. 모든 엔티티는 기본적으로 그룹에 있습니다. 트랜잭션은 한 번에 하나의 엔티티 그룹에 영향을 미치는 범위가 제한됩니다. 나는 더 긴 설명으로 나의 대답을 편집했다. –

+0

왜 이것을 downvoted입니까? 그것은 좋은 대답입니다. –

2

나는 이것을 here에 사용했습니다. 고객 객체를지도 표시 자의 부모로 설정합니다. 그들은 고객 개체와 물리적으로 저장하고 있기 때문에,

  1. 훨씬 빠르게 고객의 마커를한다 얻기 (같은 서버에, 아마에이 각 고객에 대한 엔티티 그룹을 생성하고 나에게 두 가지 장점을 제공합니다. 같은 디스크)

  2. 트랜잭션에서 고객의 마커를 변경할 수 있습니다. 그 이유는 거래가 동일한 그룹에 속해있는 모든 객체가 동일한 물리적 위치에 저장되어 있으므로 데이터에 대한 잠금을보다 쉽게 ​​구현할 수 있기 때문입니다.

1

나는이 간단한 위키 시스템에서 here을 사용했습니다. 페이지의 최신 버전은 항상 루트 엔티티이며 이전 버전은 상위 버전으로 최신 버전을 갖습니다. 복사 작업은 트랜잭션에서 수행되어 버전 일관성을 유지하고 동시성의 경우 버전을 잃지 않도록합니다.

관련 문제