참고: 이 글은 마이크 하워드의 게스트 게시물입니다. 심바 테크놀로지스.

N1QL DML

N1QL 데이터 조작 지원으로 문서를 먼저 읽어야 하는 번거로움 없이 JSON 데이터를 쉽게 삽입, 업데이트, 삭제할 수 있습니다. 이러한 N1QL 문은 단일 네트워크 요청으로 전체 버킷에 걸쳐 작업을 수행할 수 있습니다. N1QL 쿼리는 스키마에 구속되지 않으므로 스키마 제약 조건 밖에서 데이터를 조작하는 데 사용할 수 있습니다. 또한, N1QL 쿼리는 단일 테이블로 제한되지 않으며 여러 테이블에서 동시에 데이터를 조작하는 데 적합합니다. Simba 카우치베이스 드라이버를 사용하면 드라이버를 통해 이러한 쿼리를 직접 실행할 수 있습니다.

삽입

N1QL INSERT를 사용하면 새 JSON 문서를 삽입할 수 있습니다. 이 방법은 기존 테이블에 행을 추가하는 간단한 작업에도 사용할 수 있지만, 기존 스키마와 일치하지 않는 데이터를 추가할 때 특히 유용합니다. 스키마가 아닌 데이터를 추가하는 기능을 사용하면 스키마를 조작할 수 있습니다: 기존 유형의 문서에 새로운 속성을 추가하거나 새로운 유형의 문서를 추가하여 새 테이블을 만들 수 있습니다. 그리고 스키마에 새로운 열이 생깁니다. 하지만 스키마가 아닌 새로운 데이터를 보려면 SQL을 사용하여 데이터베이스를 다시 샘플링해야 합니다.

gamesim-sample 버킷을 예로 들어 게임에 "Bosses" 기능을 추가하고 싶다고 가정해 보겠습니다. N1QL INSERT를 사용하여 "boss" 유형의 새 문서를 추가하여 Bosses 테이블을 만듭니다:

삽입 gamesim-sample (키, 값) 값 ("블루 드래곤", {"유형":"보스", "히트포인트": 70000})

드라이버로 리샘플링하여 이 정보가 포함된 새 보스 테이블을 만듭니다. 몬스터 테이블과 유사한 경험치를 포함하도록 보스 테이블을 확장하기로 선택한 경우, N1QL INSERT를 사용하여 테이블의 현재 스키마와 일치하지 않는 기존 테이블에 새 문서를 삽입할 수 있습니다:

삽입 gamesim-sample (키, 값) 값 ("골든 그리핀", {"유형":"보스", "히트포인트": 80000, "experienceWhenKilled": 37000})

위의 첫 번째 경우와 마찬가지로 이 스키마 변경은 테이블을 다시 샘플링할 때까지 적용되지 않습니다. 그러나 기존 스키마와 일치하는 모든 값은 계속 사용할 수 있습니다:

리샘플링 전 삽입 후 보스 테이블

PK 적중 포인트
블루 드래곤 70000
골든 그리핀 80000

리샘플링 후 보스 테이블

PK 적중 포인트 경험사망 시
블루 드래곤 70000 NULL
골든 그리핀 80000 37000

업데이트

N1QL UPDATE를 사용하여 JSON 문서를 직접 수정할 수 있습니다. 이 작업은 SQL UPDATE와 마찬가지로 테이블의 개별 속성을 수정하는 데 사용할 수 있지만, 업데이트의 진정한 힘은 버킷 전체 범위에서 비롯됩니다. N1QL UPDATE를 사용하면 모든 데이터를 먼저 읽어들일 필요 없이 한 번의 네트워크 요청으로 버킷의 모든 일치하는 문서를 단일 쿼리를 통해 수정할 수 있습니다.

다음은 시나리오의 예시입니다: 비디오 게임을 업데이트하여 모든 플레이어와 몬스터의 공격력을 고정된 배수만큼 증가시키려고 합니다. 일반적으로 이 작업에는 두 개의 쿼리가 필요합니다. 하나는 플레이어를 업데이트하는 쿼리이고 다른 하나는 몬스터를 업데이트하는 쿼리입니다:

업데이트 전 플레이어 테이블

PK 적중 포인트
Aaron0 20210
Aaron1 23832
Aaron2 10
알리악시0 10

업데이트 전 몬스터 테이블

PK 적중 포인트
Bauchan0 3754
Bauchan1 3627
Bauchan2 4999
Bauchan3 4699
Bauchan4 3070

하지만 N1QL을 사용하면 이 작업을 완료하기 위해 단일 버킷 전체 업데이트를 발행할 수 있습니다:

업데이트 gamesim-sample SET 히트포인트 = 히트포인트*2

이 쿼리는 한 번의 작업으로 버킷에 있는 모든 히트포인트 속성의 값을 두 배로 늘립니다.

업데이트 후 플레이어 테이블

PK 적중 포인트
Aaron0 40420
Aaron1 47664
Aaron2 20
알리악시0 20

업데이트 후 몬스터 테이블

PK 적중 포인트
Bauchan0 7508
Bauchan1 7254
Bauchan2 9998
Bauchan3 9398
Bauchan4 6140

삭제

N1QL 삭제는 지정된 조건과 일치하는 버킷의 모든 문서를 제거합니다. 일괄 삭제를 수행할 때 유용할 수 있습니다. 예를 들어 맥주 샘플 버킷에서 양조장을 제거하는 작업을 할 수 있습니다. 양조장 및 모든 맥주를 제거하려면 다음과 같이 하세요. 관련 를 사용하여 다음과 같은 쿼리를 실행할 수 있습니다:

다음에서 삭제 맥주 샘플 WHERE name = "수정헌법 제21조 브루어리 카페" 또는 brewery_id = "21st_수정헌법_브루어리_cafe"

이렇게 하면 한 번의 작업으로 버킷의 "수정헌법 제21조 양조장 카페"와 관련된 모든 데이터가 제거됩니다. SQL을 사용하면 세 번의 쿼리가 필요한데, 하나는 브루어리 테이블에서 브루어리를 제거하고, 두 번째는 브루어리_주소 테이블에서 주소를 제거하며, 세 번째는 맥주 테이블에서 브루어리와 관련된 맥주를 제거합니다.

SQL DML

심바 카우치베이스 드라이버를 사용하면 SQL 구문을 사용하여 테이블을 조작할 수도 있습니다. ODBC 또는 JDBC를 통해 카우치베이스 드라이버를 ETL 애플리케이션과 같은 SQL 기반 쓰기 도구에 연결할 수 있습니다. 또한 테이블 수준으로 범위가 지정된 쿼리를 더 쉽게 실행할 수 있습니다.

삽입

SQL INSERT는 추가하려는 테이블의 스키마와 일치하는 문서를 버킷에 추가합니다. N1QL과 달리 SQL INSERT는 스키마 맵에 정의된 스키마를 적극적으로 적용합니다. 현재 스키마와 일치하도록 의도된 삽입 작업을 수행하는 경우, 실수로 스키마가 수정되는 것을 방지할 수 있으므로 SQL INSERT가 선호됩니다.

보스 테이블 예제를 계속 진행하기 위해 테이블에 새 보스를 추가해 보겠습니다. 먼저 SQL 명령을 실행합니다:

'gamesim-sample'.boss에 삽입 (PK, 히트포인트, experienceWhenKilled) VALUES ("회색 늑대", 22000, 12000)

이렇게 하면 Boss 테이블에 Wolf 행이 추가됩니다. 유형 속성은 테이블 이름에 암시되어 있으므로 지정할 필요가 없다는 점에 주목하세요:

SQL 삽입 후 보스 테이블

PK 히트 포인트 경험사망 시
블루 드래곤 70000 NULL
골든 그리핀 80000 37000
회색 늑대 22000 12000

업데이트

SQL UPDATE를 사용하면 단일 테이블을 업데이트할 수 있습니다. 이 기능은 업데이트 범위를 해당 단일 테이블로 제한하려는 경우에 유용합니다. 특정 테이블에 대한 업데이트의 경우, 범위가 좁아 다른 문서가 의도치 않게 수정되는 것을 방지하기 때문에 N1QL보다 SQL UPDATE가 선호됩니다.

예를 들어 몬스터의 공격력을 높이고 싶다고 가정해 봅시다. SQL UPDATE 명령을 실행하여 이를 수행할 수 있습니다:

업데이트 'gamesim-sample'.monster SET 히트포인트=히트포인트*1.5

이렇게 하면 몬스터의 공격력만 업데이트되고 플레이어 테이블은 그대로 유지됩니다.

업데이트 후 몬스터 테이블

PK 적중 포인트
Bauchan0 5631
Bauchan1 5440
Bauchan2 7498
Bauchan3 7048
Bauchan4 4605

삭제

SQL DELETE는 테이블에서 단일 행을 삭제합니다. SQL UPDATE와 마찬가지로 단일 테이블로 작업을 제한하는 데 유용합니다. 삽입과 유사 그리고 업데이트의 경우, SQL 삭제는 다른 문서가 실수로 제거되는 것을 방지하므로 단일 테이블에서 문서를 제거할 때 선호되는 작업입니다.

예를 들어, 100점 미만의 모든 플레이어를 삭제할 수 있습니다. SQL DELETE 명령을 실행합니다:

'gamesim-sample'.player에서 삭제 WHERE 히트포인트 < 100

이렇게 하면 몬스터는 그대로 둔 채 공격력이 100 미만인 모든 플레이어가 제거됩니다.

요약: 유연한 버킷 또는 테이블 수준의 N1QL/SQL 데이터 조작

Simba Couchbase 드라이버는 사용자가 N1QL 또는 SQL을 사용해 버킷 또는 테이블 수준에서 데이터를 유연하게 조작할 수 있도록 해줍니다. N1QL을 사용하면 스키마 조작, 대량 업데이트 또는 대량 삭제와 같은 버킷 전체 작업을 한 번의 작업으로 수행할 수 있습니다. SQL을 사용하면 테이블 수준의 데이터 조작뿐만 아니라 기존 ETL 도구에 액세스할 수 있습니다. 다음 링크에서 Simba 드라이버를 다운로드하여 사용해 볼 수 있습니다. http://www.simba.com/drivers/couchbase-odbc-jdbc/.

작성자

게시자 돈 핀토, 수석 제품 관리자, Couchbase

돈 핀토는 Couchbase의 수석 제품 관리자로 현재 Couchbase Server의 기능을 발전시키는 데 주력하고 있습니다. 데이터 기술에 대한 열정이 대단한 그는 과거에 기술 블로그와 백서 등 Couchbase Server에 관한 여러 기사를 저술한 바 있습니다. Couchbase에 입사하기 전에는 IBM에서 수년간 근무하며 DB2 정보 관리 그룹에서 소프트웨어 개발자의 역할을 수행했고, 가장 최근에는 Microsoft의 SQL Server 팀에서 프로그램 관리자로 근무했습니다. Don은 캐나다 토론토 대학교에서 컴퓨터 공학 석사 학위와 컴퓨터 공학 학사 학위를 받았습니다.

댓글 남기기