SQL++/N1QL 쿼리

올바른 쿼리 언어 선택하기: SQL++ 대 몽고

앱을 구축할 때 작업하는 쿼리 언어는 큰 차이를 만듭니다. 성능부터 팀이 기능을 얼마나 빨리 출시할 수 있는지에 이르기까지 모든 것에 영향을 미칩니다. 이 글에서는 LLM에게 어떤 쿼리 언어를 사용할지 결정할 때 가장 중요한 21가지 기준의 목록을 작성해 달라고 요청했습니다. 각 항목을 살펴보고 Couchbase에서 사용하는 SQL++와 Mongo의 쿼리 API(이전에는 MQL로 알려짐) 언어가 어떻게 비교되는지 보여드리겠습니다.

새 프로젝트를 위해 데이터베이스를 평가하고 있거나 이 두 가지 접근 방식의 차이점이 궁금한 경우, 각 접근 방식의 장점과 단점을 명확하게 파악할 수 있을 것입니다.

표현력

SQL++를 사용하면 조인, 하위 쿼리, 집계, 창 함수 등 풍부하고 복잡한 쿼리를 작성하는 동시에 유연한 문서 데이터로 작업할 수 있습니다. SQL에서 기대할 수 있는 거의 모든 것을 표현할 수 있으며 JSON에 대한 기본 지원도 제공합니다.

Mongo의 쿼리 언어는 더 제한적입니다. 집계 파이프라인으로 많은 작업을 수행할 수 있지만, 다중 컬렉션 조인이나 심층 하위 쿼리를 표현하는 것은 장황해질 수 있으며 해결 방법이나 고급 파이프라인 구성이 필요할 수 있습니다.

SQL++ 몽고
몽고에는 보다 절차적인 파이프라인이 필요합니다:

가독성

SQL++는 선언적이며 SQL 경험이 있는 사람이라면 누구에게나 친숙합니다. 쿼리의 의도를 쉽게 파악할 수 있습니다.

몽고의 파이프라인은 좀 더 장황하고 절차적이어서 각 단계를 정신적으로 밟아야 합니다.

간단한 쿼리의 경우 끔찍한. 그러나 쿼리가 증가하면(조인, 하위 쿼리, 집계) 몽고의 파이프라인 형식에서 가독성이 빠르게 떨어질 수 있습니다.

일관성

SQL++는 일관성이 매우 높습니다. 구문과 의미가 예측 가능하며 전반적으로 "문서용 SQL"처럼 느껴집니다.

중첩된 데이터가 있는 예제입니다:

몽고에서 중첩 구조를 쿼리하려면 점 표기법이나 배열 연산자로 전환해야 하는 경우가 많으며 파이프라인은 다음과 다른 스타일을 사용합니다. find(). 결국 여러 구문을 배우게 됩니다:

점 표기법을 사용한 간단한 쿼리:

더 복잡하시나요? 다시 집합의 나라로 돌아왔습니다:

성능

원시 성능의 경우, 특히 처리량이 많고 지연 시간이 짧은 워크로드에서 벤치마크에서 Couchbase SQL++가 MongoDB의 쿼리 언어를 지속적으로 앞섰습니다.

Couchbase는 다양한 벤치마크에서 뛰어난 확장성과 효율성을 입증했습니다. 예를 들어, 야후 클라우드 서비스 벤치마크(YCSB)에서 카우치베이스는 다음과 같이 나타났습니다. 스케일업 시 현저히 향상된 성능 MongoDB와 비교.

벤치마크 외에도 Couchbase 고객들은 상당한 성능 향상을 보고했습니다:

MongoDB의 최신 버전은 이전 버전에 비해 개선되었지만 특정 시나리오에서는 여전히 뒤처집니다. MongoDB 8.0은 성능 향상을 통해 MongoDB 7.0에 비해 읽기/쓰기 혼합 워크로드에서 더 빠른 속도를 달성했습니다. 그러나 이러한 개선은 이전 성능에 대한 상대적인 것이며 독립적인 벤치마크( BenchANT 데이터베이스 순위).

색인 지원

SQL++는 광범위한 인덱스 세트기본, 보조, 합성, 배열, 부분, 커버링, FTS 등 단일 언어에서 모두 사용할 수 있습니다.

몽고는 기본(ON _ID), 보조, 복합, 멀티키, 텍스트, 해시 인덱스를 지원합니다. 강력하지만 깊게 중첩된 필드나 표현식을 색인하는 데 있어서는 SQL++의 유연성이 다소 부족합니다.

SQL++에서 부분 인덱스를 사용한 예제입니다:

몽고 부분 인덱스도 비슷합니다:

조인 기능

SQL++는 전체 JOIN 구문(안쪽, 왼쪽 바깥쪽)을 지원합니다, UNNEST및 조합을 사용할 수 있습니다. 관계형 쿼리에서 문서를 일급 시민으로 취급합니다.

예시:

몽고 $조회 5.0 이후 더욱 표현력이 풍부한 파이프라인을 지원하지만, 여전히 왼쪽 외부 전체 조인 구문이 없습니다.

SQL++는 또한 표현식에 대한 다중 조인 및 조인을 지원합니다 - 몽고의 $조회 는 이에 비해 더 제한적입니다.

집계 지원

SQL++에는 표준 SQL과 마찬가지로 GROUP BY, HAVING, 윈도우 함수 및 유연한 표현식이 모두 포함되어 있습니다.

예시:

몽고의 집계 파이프라인도 가능하지만 절차가 더 복잡합니다. 다음과 같은 단계를 연결합니다. $group, $match, $프로젝트등..:

둘 다 강력하지만 SQL++는 일반적으로 SQL 사용자에게 더 간결하고 친숙하며 다음과 같은 기능을 지원합니다. 창 기능 몽고의 파이프라인에는 부족한 부분이 있습니다.

필터링 및 술어 논리

SQL++는 다음과 같은 복잡한 필터링을 완벽하게 지원합니다. AND, 또는, NOT, 사이, IN, 하위 쿼리 및 임의의 표현식을 사용할 수 있습니다.

예시:

몽고는 다음에서 필터링을 지원합니다. find() 그리고 $match 단계와 비슷하지만 구문이 더 장황하고 JSON 기반입니다:

둘 다 복잡한 술어를 표현할 수 있지만 SQL++는 매우 복잡한 부울 논리에 더 가독성이 높은 경향이 있습니다.

하위 쿼리 지원

SQL++는 상관관계, 비상관관계, 스칼라 등 모든 하위 쿼리를 지원합니다, 존재/존재하지 않음-예상할 수 있는 모든 패턴.

예시:

몽고는 같은 방식으로 하위 쿼리를 지원하지 않습니다. 일반적으로 다음을 사용하여 다시 작성해야 합니다. $조회, $패싯또는 애플리케이션 코드의 여러 쿼리를 사용할 수 있습니다. SQL++가 훨씬 더 강력하고 자연스러운 영역 중 하나입니다.

데이터 조작 지원

SQL++는 전체 삽입, 업데이트, 삭제, MERGE - 모든 표준 데이터 조작 작업을 수행합니다.

업데이트:

몽고는 또한 다음을 통해 데이터 조작을 지원합니다. insertOne, insertMany, updateOne, updateMany, deleteOne, deleteManyreplaceOne. 기능은 견고하지만 작업은 하나의 쿼리 언어로 통합되지 않고 별도의 API 호출로 이루어집니다.

업데이트 예시:

둘 다 가능하지만 SQL++는 데이터 쿼리 및 수정을 위한 일관된 단일 언어를 제공합니다.

거래 지원

SQL++는 다중 문 ACID 트랜잭션을 지원합니다(카우치베이스의 거래 시작, 커밋, 롤백), 트랜잭션은 여러 문서, 컬렉션, 심지어 여러 명세서에 걸쳐 있을 수도 있습니다.

예시:

Mongo는 버전 4.0에서 다중 문서 ACID 트랜잭션을 도입했습니다. 이 트랜잭션은 지원되지만, Mongo 쿼리 언어 자체의 일부가 아닌 세션 객체 또는 mongosh를 사용하는 드라이버에서 시작해야 합니다.

예제(Node.js의 드라이버 기반):

요약: 둘 다 ACID 트랜잭션을 지원하지만 SQL++를 사용하면 쿼리 언어 자체 내에서 선언적으로 표현할 수 있어 더 쉽고 명확합니다.

오류 처리

SQL++는 쿼리 실패 시 구조화된 오류 코드와 메시지를 클라이언트에 표시하며, SDK와 쿼리 메타데이터를 통해 액세스할 수 있습니다. 또한 동작을 제어하기 위해 방어적으로 쿼리를 작성할 수도 있습니다(예: IF EXISTS, IF MISSING, CASE 표현식).

예(방어 로직):

오류 코드는 여기에 문서화되어 있습니다: 카우치베이스 SQL++ 오류 코드.

또한, 쿼리나 명령이 실패하면 클라이언트에 오류가 발생하는 드라이버 수준의 오류 처리에 의존합니다. Mongo의 집계 파이프라인은 쿼리 내 오류 처리도 지원하지 않습니다.

예(몽고 방어 업데이트):

요약: SQL++와 Mongo는 모두 외부(드라이버 수준) 오류 처리에 의존합니다. 방어적인 쿼리 패턴을 사용하여 일반적인 오류를 완화할 수 있습니다.

확장성

SQL++에서는 SQL++ 자체로 작성된 사용자 정의 함수(UDF)를 사용할 수 있습니다. 복잡한 로직을 캡슐화하고, 표현식을 재사용하고, 쿼리를 간소화할 수 있습니다.

UDF 예시:

사용법:

몽고에는 쿼리 언어나 집계 파이프라인에 쿼리 내 UDF가 없습니다. 대신 $기능 (몽고DB 4.4에 도입)를 사용하면 집계 내에서 JavaScript 함수를 실행할 수 있지만 효율성이 떨어지고 이식성에 제한이 있습니다:

요약: SQL++ UDF는 기본적이고 효율적이며 이식성이 뛰어나며, Mongo의 $기능 는 JavaScript를 사용하며 성능 저하가 있을 수 있습니다.

선언적 성격

SQL++는 완전히 선언적입니다. 원하는 것을 표현하는 것이지 계산하는 방법을 표현하는 것이 아닙니다. 쿼리 최적화 도구에 의존하여 최상의 실행 계획을 결정합니다. 따라서 쿼리 작성과 유지 관리가 더 간단해집니다.

Mongo의 집계 파이프라인은 보다 절차적이어서 정확한 작업 순서를 지정할 수 있습니다($match, $group, $프로젝트, $sort등). 복잡한 논리의 경우 원하는 결과가 아니라 데이터 흐름 측면에서 생각해야 하는 경우가 많습니다.

휴대성

SQL++는 JSON 확장이 포함된 SQL을 기반으로 합니다. SQL을 알고 있다면 SQL++를 쉽게 배울 수 있으며, 대부분의 지식이 그대로 이어집니다. 또한 이 언어는 클라우드, 자체 관리형, 에지 등 Couchbase 배포 전반에서 이식할 수 있도록 설계되었습니다.

Mongo의 쿼리 언어는 MongoDB에 특화되어 있습니다. 그 구문은 SQL과 유사하지 않은 JSON 기반이며, 대부분 다른 데이터베이스로 전송되지 않습니다. Mongo 생태계 내부에서는 훌륭하지만 관계형 데이터베이스, Couchbase 또는 클라우드 데이터 웨어하우스와 같은 시스템으로 이식하기는 어렵습니다.

페이지 매김 지원

SQL++는 다음을 사용하여 페이지 매김을 지원합니다. LIMIT 그리고 오프셋 - 표준 SQL 스타일:

몽고는 다음과 같은 페이지 매김도 지원합니다. .limit() 그리고 .skip():

둘 다 기본적인 페이지 매김을 잘 처리합니다.

그러나 SQL++는 창 함수(예 row_number() over (...)), 보다 고급 페이지 매김 및 커서 기반 패턴을 허용하는 반면, 몽고는 이를 시뮬레이션하기 위해 추가적인 파이프라인 단계 또는 애플리케이션 로직이 필요합니다.

스키마 인트로스펙션

SQL++/Couchbase는 다음을 통해 자동 스키마 검색을 지원합니다. INFER 명령을 사용합니다. 카우치베이스는 스키마가 유연하기 때문입니다, INFER 를 사용하면 컬렉션의 문서를 분석하고 확률적 스키마를 생성하여 존재하는 필드, 유형, 중첩 및 발생 비율을 표시할 수 있습니다.

예시:

필드 이름, 유형 및 발생 비율을 포함하여 항공사 컬렉션에 대한 정보를 반환합니다:

몽고에는 다음과 같은 직접 쿼리 언어가 없습니다. INFER를 사용할 수 있지만, 몽고DB Atlas는 UI에서 스키마 탐색기를 제공합니다.

가장 가까운 옵션:

    • db.collection.aggregate([ { $sample: { size: N } } ]) + 수동 검사
    • 타사 도구

툴링 및 IDE 지원

SQL++에서 지원됩니다:

    • 카우치베이스 웹 UI 쿼리 워크벤치
    • VS 코드 SQL++ 확장
    • JetBrains IDE(플러그인)
    • REST API / CLI
    • 카우치베이스 셸

몽고의 툴링에는 다음이 포함됩니다:

    • 몽고DB 나침반(GUI)
    • 몽고쉘 / 몽고쉬
    • MongoDB Atlas UI
    • VS 코드 몽고DB 확장

다른 도구도 있습니다. 둘 다 좋은 도구가 있습니다. SQL++는 SQL 친화적인 도구(DataGrip, BI 도구 등)와 더 잘 통합됩니다. 몽고 도구는 몽고에 더 특화되어 있습니다.

커뮤니티 및 문서

SQL++ / Couchbase:

    • 공식 문서: 카우치베이스 SQL++ 참조
    • 활발한 Couchbase 개발자 커뮤니티
    • 블로그, 포럼, 스택 오버플로, 디스코드
    • SQL++는 익숙한 SQL을 기반으로 하므로 기존 SQL 리소스도 적용됩니다.

몽고:

    • 공식 문서: MongoDB 쿼리 언어 참조
    • 대규모 커뮤니티
    • 다양한 튜토리얼, 강좌, 서적
    • 웹 개발/자바스크립트 커뮤니티에서 많이 사용됨

Mongo는 더 큰 커뮤니티를 가지고 있지만(단순히 더 폭넓은 채택으로 인해), SQL++는 SQL에 친숙하고 점점 더 활발해지는 Couchbase 개발자 에코시스템의 이점을 누리고 있습니다.

앱 프레임워크와 통합

SQL++/Couchbase는 다음을 통해 지원됩니다:

    • 주요 언어의 SDK: Java, .NET(C#), Node.js, Python, Go, C++, Scala
    • ODBC / JDBC 드라이버 → BI 도구(Tableau, Power BI, Excel, Looker)에서 작동합니다.
    • REST API
    • 성장하는 에코시스템 통합스프링 데이터, EF 코어, 쿼커스 등

몽고는 있습니다:

    • 거의 모든 주요 언어에 대한 공식 드라이버
    • 개발자를 위한 강력한 에코시스템

몽고는 더 큰 에코시스템을 가지고 있지만, 일반적으로 SQL 개발자에게는 SQL++가 더 친숙합니다.

표준 준수

SQL++는 SQL에서 파생된 언어입니다:

    • JSON 문서, 배열, 중첩을 위한 확장 기능을 갖춘 ANSI SQL 기반
    • 표준 SQL 기술을 가져와서 바로 사용할 수 있습니다.
    • 기존의 많은 SQL 기반 도구와 패턴이 적용됩니다.

몽고의 쿼리 언어는 비표준 언어입니다:

    • JSON 구문 및 연산자 기반
    • ANSI SQL에 직접 매핑하지 않음
    • Mongo 관련 쿼리 패턴 학습 필요

SQL 호환성 및 표준 정렬을 원한다면 SQL++를 사용하세요. Mongo 전용 언어에 익숙하다면 Mongo의 접근 방식이 효과적이지만 이식하기가 더 어렵습니다.


요약

SQL++는 SQL에 익숙한 개발자에게 적합합니다. SQL의 상위 집합이므로 기존 SQL 지식이 그대로 이어집니다.

MongoDB의 쿼리 언어는 보다 전문적이고 절차적이어서 강력할 수 있지만 다른 사고방식을 요구하기도 합니다.

전체 기준 목록은 다음과 같습니다:

순위 기준 이름 적용 방법 중요한 이유
1 표현력 얼마나 많은 유형의 쿼리를 작성할 수 있는지 평가합니다. 데이터 작업 처리의 유연성 결정
2 가독성 명확성을 위해 샘플 쿼리 검토 학습 곡선 및 유지 관리에 영향을 미칩니다.
3 일관성 일관된 구문과 의미 찾기 버그 및 예상치 못한 상황 감소
4 성능 실제 워크로드에 대한 쿼리 실행 벤치마크 속도와 확장성에 영향을 미칩니다.
5 색인 지원 인덱스 유형 및 사용 옵션 범위 확인 쿼리 속도 최적화에 중요
6 조인 기능 다양한 조인 유형에 대한 테스트 지원 관련 데이터 작업의 핵심
7 집계 지원 그룹화 및 집계에 대한 지원 평가 분석 및 보고에 필요
8 필터링 및 술어 논리 복잡한 WHERE 및 HAVING 절을 테스트합니다. 정확한 데이터 검색 지원
9 하위 쿼리 지원 상관관계 및 중첩된 하위 쿼리에 대한 지원 확인 쿼리에 깊이 있는 정보 추가
10 데이터 조작 지원 삽입, 업데이트, 삭제, 병합 기능 테스트 데이터 유지 관리에 중요
11 거래 지원 다중 명세서 거래 지원 확인 데이터 일관성 및 원자성 보장
12 오류 처리 오류 감지 및 보고 메커니즘 검토하기 디버깅 및 안정성 지원
13 확장성 사용자 정의 함수(UDF) 추가 기능 확인 고급 요구 사항을 위한 사용자 지정 가능
14 선언적 성격 언어가 다음을 지정하는지 확인합니다. 무엇 해야 하는 것이 아니라 어떻게 개발 및 최적화 간소화
15 휴대성 시스템 간에 쿼리가 얼마나 쉽게 마이그레이션되는지 확인하세요. 공급업체 종속성 감소 및 유연성 지원
16 페이지 매김 지원 테스트 제한, 오프셋 또는 윈도우 지원 API 및 UI 기반 데이터 액세스에 중요
17 스키마 인트로스펙션 스키마/카탈로그 메타데이터 쿼리 확인 자동화 및 툴링 지원
18 툴링 및 IDE 지원 쿼리 편집기, 플러그인 등으로 구성된 설문조사 에코시스템 개발자 생산성 향상
19 커뮤니티 및 문서 문서, 커뮤니티 포럼, 튜토리얼의 품질 검토 학습 및 문제 해결의 용이성에 영향을 미칩니다.
20 앱 프레임워크와 통합 인기 언어로 된 라이브러리 및 드라이버 지원 확인 앱 개발 용이성
21 표준 준수 업계 표준과 비교(예: SQL) 휴대성 및 상호 운용성 지원

 

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

작성자

게시자 매튜 그로브스

Matthew D. Groves는 코딩을 좋아하는 사람입니다. C#, jQuery, PHP 등 무엇이든 풀 리퀘스트를 제출할 정도로 코딩을 좋아합니다. 90년대에 부모님의 피자 가게를 위해 QuickBASIC POS 앱을 만든 이후로 전문적으로 코딩을 해왔습니다. 현재 Couchbase의 선임 제품 마케팅 관리자로 일하고 있습니다. 여가 시간에는 가족과 함께 축구 경기를 관람하고 개발자 커뮤니티에 참여하며 시간을 보냅니다. 그는 .NET의 AOP, .NET의 프로 마이크로서비스, Pluralsight 저자, Microsoft MVP의 저자이기도 합니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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