SQL++/N1QL 쿼리

JSON 배열을 위한 SQL++ FLATTEN_KEYS로 TCO 절감

스키마가 잘 정립된 RDBMS는 애플리케이션 기능이 정적으로 유지될 때 유용합니다. 이러한 경직된 구조는 안정성을 보장할 수 있지만 빠르게 변화하는 비즈니스 요구사항에는 적합하지 않습니다. 오늘날 조직은 애플리케이션 인프라를 현대화하고 RDBMS에서 NoSQL로 전환하는 것을 고려해야 합니다.

이 문서에서는 NoSQL 문서 모델의 몇 가지 장점과 쿼리 성능 및 인덱스 구성을 최적화하기 위해 데이터와 인덱스를 구성하는 방법을 살펴봅니다. 또한 RDBMS 데이터 모델을 Couchbase NoSQL 데이터베이스로 마이그레이션할 때 고려할 수 있는 인덱스 전략과 쿼리 성능을 개선하고 인덱스 수를 줄이는 데 Couchbase 7.1 FLATTEN_KEYS 기능이 어떻게 도움이 되는지에 대해서도 설명합니다.

효과적인 인덱스 전략은 데이터베이스 운영에서 가장 중요한 요소 중 하나입니다. 쿼리 성능과 리소스 관리 사이의 적절한 균형을 유지하는 데 도움이 됩니다. 데이터베이스는 데이터를 효율적으로 캡처할 뿐만 아니라 해당 데이터에 대한 최적의 액세스를 제공해야 합니다. 효과적인 인덱스 전략에 있어서는 NoSQL 데이터베이스도 RDBMS와 다르지 않습니다.

RDBMS 사용 사례

다음 사항을 고려해 보겠습니다. 호텔 객체의 여행 샘플 데이터 집합을 만들고 이 정보를 캡처하기 위해 RDBMS 모델을 사용한다고 가정합니다. 관계형 모델은 다음과 같습니다:

Relational model relationships

그리고 호텔 객체에 대한 모든 세부 정보가 있습니다. 호텔. 또한 호텔_같은 를 클릭한 고객의 이름을 기록하는 객체입니다. 같은 호텔 소셜 미디어 페이지에서 확인하세요. 또한 호텔_리뷰 다양한 서비스 및 편의시설에 대한 댓글과 상세 평점을 포함한 모든 호텔 리뷰를 기록하는 객체입니다.

비즈니스 요구 사항

사용자가 방문하려는 특정 도시의 모든 호텔에 대한 요약 보기를 볼 수 있도록 쿼리를 생성합니다. 요약에는 각 호텔의 리뷰 평점과 사용자 수가 포함되어야 합니다. 좋아요 호텔입니다. 목록을 좁히려면 쿼리는 최근 리뷰(이 데이터 세트의 경우 2015년)에 초점을 맞춰야 하며 리뷰 평점은 4점 이상(5점은 최고 평점)이어야 합니다.

관계형 모델 쿼리

관계형 모델 쿼리의 인덱스

호텔: 도시 및 이름에 대한 필터가 있으므로 색인이 존재해야 합니다. 호텔 id 가 인덱스에 추가되는 이유는 JOIN에 도움이 될 수 있기 때문입니다.

호텔_리뷰: 호텔 리뷰에는 리뷰 날짜와 리뷰 평점이라는 두 가지 필터가 있습니다. 이 두 필터에는 명시적인 관계가 없으므로 이중 계산을 제거할 필요가 있습니다. 호텔_같은 그리고 호텔_리뷰를 사용하므로 이를 위해 리뷰 작성자를 여기에 추가합니다. 리뷰 작성자는 hotel_id 필드도 인덱스에 추가되는데, 이는 외래 키이고 JOIN.

호텔_리뷰: 필터가 설정되어 있지 않은 동안 호텔_같은의 경우 리뷰와 좋아요 간에는 관계가 없으므로 좋아요의 이중 계산을 제거할 필요가 있습니다. 리뷰와 좋아요 hotel_id 필드가 인덱스에 추가되는 이유는 이 필드가 외래 키이며 JOIN에 도움이 될 수 있기 때문입니다.

관계형 모델 쿼리의 실행 계획

Execution plan for relation model JSON query

수행해야 할 필요성에 주목하세요:

    1. 두 개의 조인
    2. 3개의 인덱스 스캔(각 개체당 하나씩)

문서 모델 보기

Document model view

 

문서 모델의 경우 호텔_같은 호텔_리뷰 객체는 호텔 객체에 배열로 저장됩니다. 부모 객체에 항상 자식 객체를 배열로 포함해야 한다는 엄격한 규칙은 없지만, 이 경우에는 항상 함께 액세스하기 때문에 그렇게 하는 것이 좋습니다.

 

비정규화된 문서 모델 쿼리

비정규화된 문서 모델의 인덱스

 

몇 가지 주의할 점이 있습니다:

    1. 그리고 SQL++ 쿼리는 단일 호텔 객체 사이에 명시적인 JOIN을 수행할 필요가 없습니다. 호텔 객체와 자식 같은 또는 review
    2. 쿼리는 모든 쿼리 술어를 포함하는 단일 인덱스, 즉 hotel.city,reviews.ratingsreviews.date
    3. 배열이 인덱싱될 때 인덱스는 단일 키에만 있을 수 있습니다. FLATTEN_KEYS()는 배열의 복합 필드를 허용하므로 술어가 여러 배열 필드에 있을 수 있습니다.

문서 모델 쿼리의 실행 계획

execution plan for the document model query

다음을 수행해야 합니다.

    1. 두 개의 UNNEST(단일 문서에 있으므로 JOIN이 필요하지 않음)
    2. 단 한 번의 인덱스 스캔 

 

요약

Relational model converted to document model

관계형 모델이 문서 모델에서 단일 개체로 비정규화된 경우:

 

    1. SQL++ 쿼리는 JOIN을 수행할 필요가 없으므로 더 간단합니다.
    2. 여러 관계형 모델 인덱스를 단일 문서 모델로 결합할 수 있습니다.
    3. Couchbase 7.1 FLATTEN_KEYS 기능은 여러 배열 요소 술어를 단일 인덱스로 결합합니다.

이는 최근에 제공한 새로운 기능 중 하나에 불과합니다. 자세한 내용은 다음을 참조하세요. Couchbase Server 7.1의 새로운 기능.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 Binh Le

Binh Le는 Couchbase 쿼리 서비스의 수석 제품 관리자입니다. Couchbase에 입사하기 전에는 Oracle에서 근무하며 Sales Cloud Analytics 및 CRM OnDemand의 제품 관리 팀을 이끌었습니다. 영국 브라이튼 대학교에서 컴퓨터 공학 학사 학위를 받았습니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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