오라클은 제가 처음 개발한 데이터베이스였기 때문에 관계형 모델을 버리고 NoSQL 같은 것으로 전환하는 것이 두려운 일처럼 보일 수 있다는 것을 알고 있습니다. 하지만 막상 Couchbase가 제공하는 NoSQL 문서 모델로 전환하기로 결정했을 때는 전혀 두렵지 않았습니다. 다른 NoSQL 데이터베이스와 달리 Couchbase는 RDBMS 사용자에게 매우 친숙한 SQL과 유사한 언어를 제공하기 때문입니다.
보다 쉽게 전환할 수 있도록 Oracle RDBMS를 사용 중이며 Couchbase로 전환하고자 하는 시나리오를 살펴보겠습니다.
오라클과 카우치베이스의 주요 차이점
오라클 출신이시니 테이블, 행, 열로 구성된 관계형 데이터베이스라는 것은 이미 알고 계실 것 같습니다. 모든 관계형 데이터베이스에 관해서는 꽤나 표준입니다. Couchbase와 같은 NoSQL 문서 데이터베이스는 그렇지 않습니다. 대신 구조가 없고 제한이 거의 없는 JSON 객체와 배열로 작업하고 있습니다.
제 생각에는 데이터 모델링이 가장 큰 차이점이지만, 이것이 유일한 차이점은 아닙니다. 하지만 거기서부터 시작하겠습니다.
관계형 데이터베이스 데이터 모델
이 글에서 간단하고 쉽게 이해할 수 있도록 다음 표가 있다고 가정해 보겠습니다:
- 고객
- ID: 숫자 기본 키
- first_name: varchar
- 성_이름: varchar
- 고객_역사
- ID: 숫자 기본 키
- product_id: 숫자 외래 키
- 수량: 숫자
- 고객_주소
- ID: 숫자 기본 키
- customer_id: 숫자 외래 키
- 도시: 바이트열
- 상태: 바이트열
- 제품
- ID: 숫자 기본 키
- 이름: varchar
- 설명: varchar
- 제품 리뷰
- ID: 숫자 기본 키
- product_id: 숫자 외래 키
- customer_id: 숫자 외래 키
- 리뷰: varchar
위의 표와 열은 가장 복잡하지는 않지만 관계형 모델을 증명합니다. 이들은 모두 기본 키 관계와 외래 키 관계를 사용하여 연결됩니다.
NoSQL 데이터 모델 옵션
NoSQL은 스키마가 없기 때문에 방금 본 오라클의 데이터를 모델링하는 방법은 여러 가지가 있습니다.
참조 문서
문서 참조는 관계형 데이터 측면에서 가장 친숙하게 느껴질 것입니다. Oracle과 같은 RDBMS에서는 기본 키와 외래 키를 통해 다른 데이터 행을 참조합니다. NoSQL에는 기본 키나 외래 키의 개념이 없지만 그렇다고 해서 같은 종류의 관계를 함께 조작할 수 없다는 의미는 아닙니다.
예를 들어 다음 NoSQL 문서를 살펴보겠습니다:
c::1
1 2 3 4 5 6 7 |
{ "type": "customer", "first_name": "Nic", "last_name": "라보이" } |
ca:1
1 2 3 4 5 6 7 8 |
{ "type": "customer_address", "customer_id": "c::1", "city": "샌프란시스코", "state": "캘리포니아" } |
위의 문서가 해당 RDBMS와 유사하게 모델링되었다고 가정합니다. c::1 는 제가 만든 아이디 값일 뿐입니다. 고객 문서 및 ca:1 는 제가 만든 아이디입니다. 고객_주소 문서.
아직 쿼리하지는 않겠지만, 이러한 문서는 각각 관계형 데이터베이스의 단일 행에 해당하는 것으로 생각할 수 있습니다. 예를 들어 고객 오라클 테이블은 카우치베이스에서 하나의 문서가 됩니다.
아주 비슷하죠?
문서 삽입
여기서부터 Oracle과 상황이 매우 달라질 수 있습니다. JSON은 복잡한 데이터이기 때문에 문서 내에 배열을 가질 수 있습니다. 그렇다면 비슷한 데이터를 모두 함께 보관하려면 어떻게 해야 할까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "type": "customer", "first_name": "Nic", "last_name": "라보이", "주소": [ { "city": "샌프란시스코", "state": "캘리포니아" }, { "city": "마운틴 뷰", "state": "캘리포니아" } ] } |
어떻게 생각하시나요? 위와 같이 문서당 하나의 주소가 아닌 특정 고객의 모든 주소를 고객 데이터와 함께 저장하고 있습니다.
Oracle 데이터에 매우 복잡한 관계가 있어 Couchbase로 변환할 때 동일한 데이터가 둘 이상의 Couchbase 문서에 포함되는 경우 어떻게 되는지 궁금하실 것입니다. 이런 일이 발생할 수 있지만 나쁜 것은 아닙니다. Couchbase와 같은 NoSQL 데이터베이스에서는 정규화된 데이터가 필요하지 않습니다. 하지만 정말 걱정된다면 두 가지 접근 방식을 혼합하는 것은 어떨까요? 다음과 같은 데이터를 보관하세요. 고객_역사 관계를 맺지 않고 다른 사람을 참조하여 더 자주 변경할 수 있습니다.
오라클과 카우치베이스의 쿼리 차이점
오라클 SQL과 카우치베이스 N1QL 비교
Oracle이 데이터베이스의 데이터를 쿼리할 때 고유한 방식의 기존 SQL을 사용한다는 것은 잘 알려진 사실이지만, 이는 SQL입니다. 예를 들어 모든 제품 리뷰를 반환하고 이를 중심으로 관계형 테이블을 확장하려는 경우 다음과 같은 쿼리를 수행합니다:
1 2 3 4 5 6 7 |
선택 c.이름, c.성, p.이름, r.리뷰 FROM 리뷰 r JOIN 고객 c 켜기 r.customer_id = c.id JOIN 제품 p 켜기 r.product_id = p.id |
Couchbase NoSQL 데이터로도 거의 동일한 작업을 수행할 수 있다고 하면 어떻게 될까요? 다음 Couchbase N1QL 쿼리를 예로 들어보겠습니다:
1 2 3 4 5 6 7 |
선택 c.이름, c.성, p.이름, r.리뷰 FROM `버킷-이름` r JOIN `버킷-이름` c 켜기 키 r.customer_id JOIN `버킷-이름` p 켜기 키 r.제품_id |
크게 다르지 않죠? 우리가 사용하고 있다는 것을 알 수 있습니다. 버킷 이름
를 세 번 입력해야 합니다. 이는 NoSQL에는 테이블이 없고 모든 다른 문서와 문서 유형이 동일한 버킷에 존재하기 때문입니다. 문서 키는 조인하는 값입니다.
Oracle에 새 데이터를 삽입하고 싶을 수도 있습니다. 고객 테이블을 사용합니다. Oracle에서는 다음과 같은 작업을 수행할 수 있습니다:
1 2 3 4 |
삽입 INTO 고객 (id, first_name, last_name) 가치 (1, 'Arun', 'Gupta'); |
Couchbase에 데이터를 삽입하려면 다음을 수행하면 됩니다:
1 2 3 4 |
삽입 INTO `버킷-이름` (KEY, VALUE) 가치 (1, {"first_name": "Arun", "last_name": "Gupta"}); |
오라클과 카우치베이스의 개발 차이점
개발자의 관점에서 보면 오라클을 데이터베이스로 사용하는 많은 사람들이 자바를 사용하는 경향이 있습니다. 오라클이 Java에만 국한된 것은 아니지만, Java는 오라클이기 때문에 종종 의미가 있습니다. 그렇기 때문에 다음 몇 가지 예제에서는 특히 Java를 중심으로 설명합니다.
오라클 JDBC 드라이버
Java 애플리케이션에서 Oracle 데이터베이스에 연결하려면 JDBC(Java 데이터베이스 커넥터) 드라이버를 사용해야 합니다. Maven과 같은 도구를 사용하거나 수동으로 프로젝트에 드라이버를 포함하면 드라이버를 로드하고 데이터 쿼리를 시작할 수 있습니다.
예를 들면 다음과 같습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
클래스.forName("oracle.jdbc.driver.OracleDriver"); 속성 정보 = new 속성(); 정보.put("user", "nraboy"); 정보.put("비밀번호", "비밀번호"); 연결 연결 = DriverManager.getConnection("jdbc:oracle:thin:@//HOST:PORT/DATABASE", 정보); 성명서 stmt = 연결.getConnection().createStatement(); 결과 설정 rs = stmt.실행 쿼리("SELECT * FROM customer"); 동안(rs.다음()) { // rs.getString("first_name"); } stmt.닫기(); |
카우치베이스 자바 SDK
Java 애플리케이션을 통해 Couchbase에 연결하려면 JDBC 드라이버가 있긴 하지만 JDBC 드라이버가 아닌 Couchbase Java SDK를 사용해야 합니다. SDK를 사용하는 이유는 SDK를 사용하면 작업이 매우 쉬워지기 때문입니다.
예를 들어, Couchbase SDK를 사용하면 Oracle과 동일한 종류의 작업이 다음과 같이 보일 수 있습니다:
1 2 3 4 5 6 7 8 |
카우치베이스클러스터.create(호스트).오픈버킷(버킷, 비밀번호); 문자열 쿼리 = "SELECT * FROM `버킷 이름-여기`"; N1qlQueryResult 쿼리 결과 = 버킷.쿼리(쿼리); 에 대한 (N1qlQueryRow 행 : 쿼리 결과) { // row.value().toMap(); } |
물론 위의 내용은 Couchbase Java SDK를 다운로드했거나 Maven을 사용하여 다운로드했다고 가정합니다.
도구의 차이점
Oracle을 사용할 때 사용할 수 있는 많은 도구가 있습니다. 예를 들어 데이터베이스에 대한 쿼리를 실행하려는 경우 명령줄 도구를 사용할 수 있습니다. SQLPlus. Couchbase로 전환할 때도 비슷한 도구를 계속 사용할 수 있습니다. 명령줄 도구를 찾고 있다면 CBQ를 사용하여 데이터를 쿼리할 수 있습니다. 오라클의 파워 유저인 경우 SQL 개발자를 사용하면 걱정할 필요가 없습니다. 쿼리 워크벤치 를 출시할 예정입니다.
데이터 마이그레이션 도구
데이터와 관련하여, 어떻게 하면 데이터를 최대한 빨리 Oracle에서 Couchbase로 가져올 수 있는지 궁금할 것입니다. Manuel Hurtado는 다음과 같은 훌륭한 블로그 기사를 작성했습니다. 오라클에서 카우치베이스로 데이터 이동.
간단히 말해, Manuel의 게시물은 다음과 같은 Java 유틸리티를 사용하는 방법을 안내합니다. 오라클2카우치베이스. 이 도구는 테이블의 행을 JSON 문서로 내보냅니다.
결론
오라클과 카우치베이스는 매우 다른 두 데이터베이스 플랫폼이지만, 전환이 그리 어렵지 않을 만큼 충분히 유사합니다. 관계형 데이터 모델은 참조 문서를 사용하여 어느 정도 보존할 수 있으며, 이러한 문서는 오라클 SQL과 충분히 유사한 SQL 유사 언어를 사용하여 쿼리할 수 있으므로 친숙하게 사용할 수 있습니다.
오라클 사용자라면 Couchbase를 무시해서는 안 됩니다. 현재 데이터가 존재하는 방식은 20년 전과는 다릅니다. NoSQL의 유연성은 미래를 위해 매우 중요합니다.
[...] 오라클 데이터베이스에서 카우치베이스로 이동 [...]