1

내 검색어 중 하나는 사용자 입력에 따라 다양한 필터와 정렬 순서를 취할 수 있습니다. 이렇게하면 50 개 이상의 인덱스로 이루어진 거대한 index.yaml 파일이 생성됩니다.App Engine에 필요한 색인 수를 줄이기 위해 속성을 비정규 화해야합니까?

많은 부울 및 다중 선택 (문자열) 속성을 단일 문자열 목록 속성으로 비정규 화하려고합니다. 대부분의 쿼리는 단순히 문자열 목록 속성에 필터를 추가하기 때문에이 방법을 사용하면 쿼리 조합 수를 줄일 수 있으며 인덱스 수가 대폭 감소합니다.

분명히 내 저장 용량은 커지지 만 많은 데이터가 없으므로 실제로는 문제가되지 않습니다.

이 방법이 좋은 생각인가요? 아니면 다른 단점이 있습니까?

답변

3

항상 그렇듯이 이것은 엔티티를 쿼리하는 방법에 달려 있습니다. 이와 같은 속성 목록에 대해 실행할 수있는 대부분의 쿼리의 경우 App Engine에는 app.yaml에 지정할 필요가없는 자동으로 생성 된 인덱스가 이미 포함되어 있습니다. 마찬가지로, 실행하려는 대부분의 쿼리는 복합 인덱스가 필요합니다. 목록 속성을 사용하여 수행 할 수 없거나 해당 목록 속성에 '폭발'인덱스가 필요합니다.

이 개체에서 일반적으로 실행하는 쿼리 종류에 대해 자세히 알려 주시면보다 구체적인 조언을 드릴 수 있습니다.

+0

이 질문이 게시 된 이후에 App Engine에 수행 된 많은 업데이트를 고려해 볼 때이 질문에 대한 답변으로 알려 드리겠습니다. 질문이 너무 일반적이라고 생각하지만이 문제는 http://code.google.com/intl/sv-SE/appengine/articles/indexselection.html의 특정 솔루션을 제공하는이 기사에서 강조되었습니다. – Aneon

2

인덱스 수를 줄이기 위해 데이터를 역 정규화하면 좋은 결과를 얻을 수 있습니다. 필요한 인덱스의 수를 줄이면 업데이트 할 인덱스가 줄어들지 만 (하나의 인덱스는 업데이트가 더 많아집니다) 이것이 GAE의 성능에 어떻게 영향을 미치는지는 분명치 않다. 원래의 필드를 그대로두면 (문자열리스트 프로퍼티에 데이터를 복사하기 때문에) 물론 크기가 더 커지 겠지만 엔티티가 이미 상당히 커지면 그리 중요하지 않을 수 있습니다.

목록의 색인에 각각 개의 항목이 포함되므로 다소 복잡합니다 (엔터티 당 하나의 항목이 아니라 각 항목의 목록에 각 요소가 있음). 이는 공간 및 쿼리 성능에 확실히 영향을 미칩니다. 또한 여러 개의 목록 속성이 포함 된 색인을 만들 때주의해야합니다. 또는 여러 개의 목록 속성 => 각 목록의 값 조합마다 색인 항목이 하나씩> 색인을 분해하는 문제가 발생할 수 있습니다.

실습을 통해 실제로 어떻게 작동하는지 확인하십시오 (AppStats!을 사용하십시오!).

+0

나는 또한 이것에 관심이있다. 어떤 경우에는 클래스의 직렬화 된 버전이 절대로 쿼리되지 않는 객체 또는 속성을 저장하는 데 사용할 수 있는지 궁금해했다. – Jacob

+0

절인 된 값을 저장하는 blob 속성을 사용하려고 생각하십니까? 내용이 상당히 크지 않고 압축 할 수 없다면 (예 : gzip으로),'indexed = False'로 표시된 속성에 값을 저장하는 것이 더 쉽고 효율적일 것 같습니다. –

+0

실제로 더 많은 공간을 사용하지 않습니다. 속성이 10 개인 개체가 하나있는 경우 10 개의 인덱스 행입니다. 10 개의 항목을 가진 listproperty를 가진 객체는 또한 10 개의 인덱스 행을 생성합니다. 폭발적인 색인은 동일한 복합 색인에서 여러 목록 특성을 색인화하려고 시도 할 때만 발생합니다. –

0

은 "그것은 확실히 내 저장 크기를 증가하지만, 이건 정말 내가 그 많은 데이터를 필요가 없습니다 으로 문제가되지 않습니다."

를 이것이 사실이라면 다음 비정규 이유가 없다.

관련 문제