분류

인덱스 및 선택성

Couchbase의 인덱스

카우치베이스의 인덱스는 백엔드 처리를 유연하게 수행할 수 있는 수단입니다. 인덱스를 활용하면 재고 관리 시스템에서 볼 수 있는 것과 같은 의사 결정 트리 유형의 집계 및 선택 기능을 만들 수 있습니다. 잘 정의되고 유연한 데이터 모델을 Couchbase의 인덱싱 하위 시스템과 함께 사용하면 높은 수준의 선택성을 제공하는 애플리케이션을 구축할 수 있습니다. Couchbase는 동적 쿼리 환경을 위해 매개변수를 전달할 수 있는 기능을 제공합니다. 사용 가능한 매개변수에 대한 간략한 검토는 다음과 같습니다:

  • Key=""
  • Keys=[]
  • 시작키/종료키=""
  • 시작키_독아이디/끝키_독아이디=""
  • stale=[false,update_after,true]
  • 그룹/그룹별
  • include_docs=[true]

선택성 구축

다음 예에서는 재고 관리 시스템을 활용하여 Couchbase에서 인덱스의 선택 능력을 보여드리겠습니다. 이 예는 선택성이 있는 쿼리를 수행할 수 있어야 하는 의류 매장을 위한 것입니다:

  • 항목 카테고리별
  • 품목 공급업체별
  • 품목별 할인

이 예에서는 인벤토리 버킷에 저장된 항목의 JSON 형식을 단순화하여 7개의 문서로 구성된 작은 테스트 데이터 세트를 사용합니다. 샘플 문서는 다음과 같습니다:

{
        "item": "KS-00114629 짙은 회색 안경",
        "공급업체": "케이트 스페이드",
        "카테고리": "안경"
}

이 버킷을 사용하면 다음과 같이 "catalogue"라는 인덱스를 만들 수 있습니다:

function(doc,meta){
  if(doc.item){
        if(doc.vendor){
                emit(doc.vendor, doc.item);
        }
        if(doc.category){
                emit(doc.category, doc.item);
        }
        if(doc.discount){
                emit(doc.discount,doc.item);
        }
  }
}

이 인덱스는 쿼리에서 선택성을 허용하는 몇 가지 흥미로운 기능을 수행합니다. 이 인덱스의 워크플로는 다음과 같습니다:

  • if(doc.item){  // 문서에 "item"이라는 필드가 있는지 확인합니다.   
  • if(doc.vendor){  //C 문서에 공급업체라는 필드가 있는지 확인하고, 있는 경우 공급업체 이름을 키로, 항목 필드를 값으로 출력합니다.
  • if(doc.category){  //문서에 카테고리라는 필드가 있는지 확인하고, 있다면 카테고리 이름을 키로, 항목 필드를 값으로 출력합니다.
  • if(doc.discount){  //C 문서에 할인이라는 필드가 있는지 확인하고, 있는 경우 할인 금액을 키로, 항목 필드를 값으로 출력합니다.

이 인덱스는 문서에 공급업체, 카테고리 및 할인이 있다고 가정할 때 각 문서에 대해 잠재적으로 세 개의 행을 생성할 수 있습니다.   
    
배포된 후 클러스터의 모든 엔드포인트(이 예에서는 IP가 192.168.60.101인 클러스터 노드 사용)에서 이 인덱스를 호출하면 다음과 같이 됩니다:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0

16개의 행이 반환됩니다:

{"total_rows":16,"rows":[
{"id":"0000000007″,"key":"10″,"value":"CH-44308670 투톤 옐로우 크렘린 백"},
{"id":"0000000006″,"key":"15″,"value":"IH-00884501 트리플 링 숄더백"},
{"id":"0000000007″,"key":"Chrome","value":"CH-44308670 투톤 옐로우 크렘린 백"},
{"id":"0000000001″,"key":"안경","value":"KS-00114629 짙은 회색 안경"},
{"id":"0000000003″,"key":"glasses","value":"RL-00657038 블루 로데오 선글라스"},
{"id":"0000000002″,"key":"핸드백","value":"KS-00113108 블루 숄더 스트랩 핸드백"},
{"id":"0000000004″,"key":"핸드백","value":"RL-00332567 옐로우 메신저백"},
{"id":"0000000006″,"key":"핸드백","value":"IH-00884501 트리플 링 숄더백"},
{"id":"0000000007″,"key":"핸드백","value":"CH-44308670 투톤 옐로우 크렘린 백"},
{"id":"0000000005″,"key":"아이언하트","value":"IH-00130628 슬림컷 데님"},
{"id":"0000000006″,"key":"아이언하트","value":"IH-00884501 트리플 링 숄더백"},
{"id":"0000000001″,"key":"케이트 스페이드","value":"KS-00114629 짙은 회색 안경"},
{"id":"0000000002″,"key":"케이트 스페이드","value":"KS-00113108 블루 숄더 스트랩 핸드백"},
{"id":"0000000005″,"key":"바지","value":"IH-00130628 슬림컷 데님"},
{"id":"0000000003″,"key":"랄프 로렌","value":"RL-00657038 블루 로데오 선글라스"},
{"id":"0000000004″,"key":"랄프로렌","value":"RL-00332567 옐로우 메신저백"}
]
}

쿼리의 선택성

데이터 모델에 정의되고 인덱스에 배포된 유연성을 통해 이 인덱스는 데이터베이스에 대해 높은 수준의 선택성을 가진 쿼리를 수행하는 데 활용될 수 있습니다. 범위 쿼리는 특정 공급업체의 모든 항목을 선택하는 데 활용할 수 있습니다. 예를 들어, Kate Spade의 버킷에 있는 모든 항목을 보려면 다음과 같이 시작 키와 끝 키를 "kate spade"로 전달할 수 있습니다:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0&startkey=%22kate%20spade%22&endkey=%22kate%20spade%22

인덱스에 16개의 행이 포함되어 있어도 클라이언트 애플리케이션에는 2개의 행만 반환됩니다: 

{"total_rows":16,"rows":[
{"id":"0000000001″,"key":"케이트 스페이드","value":"KS-00114629 짙은 회색 안경"},
{"id":"0000000002″,"key":"케이트 스페이드","value":"KS-00113108 블루 숄더 스트랩 핸드백"}
]
}

이 시점에서 인덱스에 포함된 항목뿐만 아니라 이 쿼리를 통해 전체 문서를 반환하는 옵션도 있습니다. 동일한 쿼리를 다시 실행하고 "include_docs" 매개변수를 "true"로 설정하면 다음과 같이 됩니다:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0&startkey=%22kate%20spade%22&endkey=%22kate%20spade%22&include_docs=true

이번에는 범위와 일치하는 인덱스의 각 행에 대한 전체 문서와 함께 동일한 두 개의 ID가 반환됩니다:

{"total_rows":16,"rows":[
{"id":"0000000001″,"key":"케이트 스페이드","value":"KS-00114629 다크그레이안경","doc":{"meta":{"id":"0000000001″,"rev":”6-00002ec467e06f2a0000000000000000″,”expiration”:0,”flags”:0},”json”:{“item”:”KS-00114629 Dark Grey Glasses”,”vendor”:”kate spade”,”category”:”glasses”}}},
{"id":"0000000002″,"key":"케이트 스페이드","value":"KS-00113108 블루 숄더 스트랩 핸드백","doc":{"meta":{"id":"0000000002″,"rev":"6-00002ec9a2088ad70000000000000000″,"만료":0,"플래그":0},"json":{"item":{"KS-00113108 블루 숄더 스트랩 핸드백","vendor":"kate spade","category":"핸드백"}}}
]
}

이 데이터 모델의 강점은 현재 할인이 적용된 품목을 조회하는 쿼리를 실행하면 더 자세히 설명할 수 있습니다. 카우치베이스가 사용하는 유니코드 정렬 순서로 인해 엔드키가 'a'인 쿼리를 수행할 수 있으며 모든 숫자 키 값이 반환됩니다:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&endkey=%22a%22

항목에 대한 문서에 할인이 존재하기 때문에 인덱스에 있는 두 행이 반환됩니다.

{"total_rows":16,"rows":[
{"id":"0000000007″,"key":"10″,"value":"CH-44308670 투톤 옐로우 크렘린 백"},
{"id":"0000000006″,"key":"15″,"value":"IH-00884501 트리플 링 숄더백"}
]
}
이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 토드 그린스타인

토드 그린스타인은 카우치베이스의 솔루션 아키텍트입니다. Todd는 API 설계, 아키텍처, 데이터 모델링, nodejs 및 골랑 개발을 전문으로 합니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.