2012-10-05 2 views
1

Google AppEngine에서 내 앱에 문제가 있습니다. 특히 데이터 스토어에 문제가 있습니다. 이야기가 조금 깁니다. 내 데이터 모델은 다음과 같습니다.appengine : ancester가있는 엔티티에서 키별로 엔티티를 쿼리하는 방법은 무엇입니까?

  1. 사용자가 엔티티를 만들 수 있습니다. 각 엔티티의 속성은 # 1입니다. 자동 생성 된 키. # 2). 창조자. #삼). 번호.
  2. 앱에서 다음 쿼리를 수행하고 있습니다. a). 제작자별로 엔터티를 쿼리합니다 (# 2). 비). 숫자 속성 (# 3)으로 엔터티를 쿼리하십시오. 기음). id (# 1)로 엔티티를 질의하십시오.

저급 데이터 저장소 API를 사용하고 있습니다. 이제 시도한 몇 가지 문제가있는 접근법은 다음과 같습니다.

[접근법 1] : Datastore를 사용하여 엔티티를 parentless (ancester 없음)로 만들면 상황이 좋으며 특히 'c'쿼리를 쉽게 수행 할 수 있습니다. Datastore.get (k) 작성

Approach1의 문제점 : 데이터 저장소가 "결국 일관성이 있으므로"쿼리 'a'의 결과는 항상 현재 날짜로 업데이트되지 않습니다. 사용자가 엔티티를 작성한 경우 작성한 모든 엔티티가 나열되고 새로 작성된 엔티티가 항상 누락됩니다. 몇 초 후에 새로 고침에 의해서만 나타납니다 ... Memcache를 사용해 보았습니다. 케이스를 돕지 않습니까? 아니면 좋은 방법을 찾지 못하겠습니까?

위의 문제를 극복하기 위해 데이터 구조가 변경되었습니다. 다음은 [접근법 2]입니다. 각 엔티티를 생성 할 때 생성자를 기반으로 키를 생성하고 새 엔티티를 키의 자식으로 지정합니다. 따라서 사용자가 만든 모든 엔티티는 ancester가있는 엔티티입니다. 따라서 쿼리 'a'는 적시에 작동하고 쿼리 'b'도 작동하는 것 같습니다.

Approach2의 새로운 문제점 : 'c'쿼리의 경우 항상 아무것도 반환하지 않습니다. 여기 내 쿼리 'c'가 있습니다. 둘 다 항상 엔티티 찾을 수 없습니다 :

방법을 1 :
엔터티 엔 =에서 datastore.get (K)

방법 2 :

DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); 
Query q = new Query(kind) 
    .setFilter(FilterOperator.EQUAL.of(Entity.KEY_RESERVED_PROPERTY, k)); 
Entity en = ds.prepare(q).asSingleEntity(); 

또 다른 시도 : Approach3 : 그룹의 모든 한 조상 아래 엔티티. 이것은 Approach1의 문제점을 극복하고 조상 필터로 질의 할 수 있으므로 결과를 검색하는 것이 좋습니다.

Approach3의 문제점 : 이러한 구조는 모든 엔티티를 하나의 엔티티 그룹으로 그룹화합니다. Google 데이터 저장소 사양에 따라 쓰기 작업은 최대 초당 5 회 발생할 수 있습니다. 이것은 내가 치고 싶지 않은 한계입니다 ...

저는 이런 종류의 데이터 모델이 정말로 일반적이라고 생각합니다. 데이터를 구조화하는 적절한 방법이 있습니까? 어떤 도움을 주셔서 감사합니다. 감사합니다 ...

답변

1

나는 때문에 질문의 형식하지만 ...

당신도 부모의 키를 포함해야 ID로 조회에 당신이 요구하는 것을 아주 확실하지 않다. 키에는 부모 데이터와 하위 데이터가 모두 포함되어 있습니다. 자식 데이터 만 사용하는 경우 "이름"이 아니기 때문에 찾고있는 데이터를 반환하지 않습니다. 전체 경로 (조상/자식)는 이름입니다.

그래서 당신이 만들고있는 키에 부모를 포함 시켜라.키가 불완전대로, 부모가있는 경우

key = parent, parent_ID, child, child_ID 

key = child, ID 

으로 작동하지 않습니다 그것을 당신이 그렇게 원하는 데이터를 반환 할 수 없습니다.

+0

답변을 주셔서 감사합니다. 접근법 2에서와 같이 엔티티는 서로 다른 조상 아래 그룹화되므로 쿼리하려는 모든 엔티티에 대해 동일한 방식의 경로는 없습니다. 엔티티가 조상없이 작성되면 조회는 정상적으로 작동하지만 항상 최신으로 갱신되지 않습니다 (Approach 1로 폴백). – Verilocos

+0

실제로 다른 접근법 3이 있습니다. 하나의 조상에 모든 엔티티를 그룹화합니다. 접근법 1의 문제를 해결하고 Paul이 언급 한 것처럼 질의를받을 수 있습니다. 그러나 새로운 문제가 있습니다. Google 데이터 스토어 사양에 따라, 한 조상 아래의 엔티티는 "하나의 엔티티 그룹"으로 간주되며 "하나의 엔티티 그룹"에있는 엔티티에 대한 쓰기 조작에 대한 제한이 있습니다. 이것은 내가 치고 싶지 않을 또 다른 제한 사항입니다 ... 최신 문제에 대한 – Verilocos

+0

에 대해, 제가 그것이 문제가 될 때 저의 의도는 memcache에 명시 적으로 내용을 쓰고 그것을 시도하고 가져 오는 것입니다. 첫째, 데이터 저장소가 실패하면 다시 데이터 저장소로 폴백합니다. 그게 당신에게 효과가 없다고 말하는데, 왜 그럴 수 없어요. 데이터를 반환하지만 반환하는 위치가 투명하면 (즉, memcache를 시도한 경우 아무 것도 표시되지 않으면 다시 memcache가 데이터 저장소로 반환됩니다), 그러면 어떻게 작동하지 않는지 알 수 없습니다. 일반적으로 새 데이터를 명시 적으로 쓸 때 memcache를 항상 무효화 할 수 있으므로 기본적으로이 작업을 수행합니다. –

관련 문제