모든 개발자나 시스템 관리자가 한 번쯤은 MySQL을 다뤄본 적이 있다고 가정해도 무방할 것 같습니다. 종종
PHP와 같은 언어가 번성하던 몇 년 전에는 모든 신입 개발자의 통과의례였습니다. 이제 여러분은 다음과 같은 상황에 처할 수 있습니다.
상황이 바뀌었으므로 이제 데이터베이스를 변경해야 할 수도 있습니다. 좀 더 구체적으로 스키마가 없는 NoSQL 데이터베이스로 변경하는 것입니다.
언뜻 보기에는 차이점을 훑어보는 것이 무서운 작업처럼 보일 수 있습니다. 모든 테이블과
제약 조건이 있나요? 데이터를 쿼리하려면 어떻게 해야 하나요? 어떤 개발 언어를 사용할 수 있나요?
속도를 늦추고 MySQL RDBMS를 사용 중이며 Couchbase로 전환하려는 시나리오를 살펴보겠습니다.
MySQL과 Couchbase의 주요 차이점
MySQL은 테이블, 행, 열로 구성된 관계형 데이터베이스라는 것을 이미 알고 계실 것으로 생각됩니다.
모든 관계형 데이터베이스에 있어서는 매우 표준적인 방식입니다. 하지만 Couchbase와 같은 NoSQL 문서 데이터베이스는 그렇지 않습니다.
대신 구조가 없고 제한이 거의 없는 JSON 객체와 배열로 작업하게 됩니다.
제 생각에는 데이터 모델링이 가장 큰 차이점이지만, 이것이 유일한 차이점은 아닙니다. 하지만 거기서부터 시작하겠습니다.
관계형 데이터베이스 데이터 모델
간단하게 설명하기 위해 작은 데이터 모델을 사용하겠습니다. 더 복잡한 시나리오에 맞게 언제든지 조정할 수 있습니다. 데이터 모델
는 다음과 같습니다:
고객
- ID: 숫자 기본 키
- 이름: varchar
- 성: varchar
고객_주소
- ID: 숫자 기본 키
- 도시: 바이트열
- 상태: 바이트열
- 우편: 바이트열
- customer_id: 숫자 외래 키
위의 두 테이블과 그 열은 가장 복잡하지는 않지만 여전히 기본 및
외래 키 관계.
NoSQL 데이터 모델 옵션
NoSQL 문서는 스키마가 없기 때문에 조금 다릅니다. 즉, 다음과 같은 경우 여러 가지 옵션이 있습니다.
는 MySQL에서 본 데이터를 모델링하는 데 사용됩니다.
참조 문서
참조 문서는 관계형 데이터 측면에서 가장 친숙하게 느껴질 것입니다. MySQL과 같은 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 9 |
{ "type": "customer_address", "city": "샌프란시스코", "state": "CA", "zip": "94101", "customer_id": "c::1" } |
위의 문서가 해당 RDBMS와 유사하게 모델링되었다고 가정합니다. c::1 는 제가 만든 아이디 값일 뿐입니다.
고객 문서 및 ca:1 는 제가 만든 아이디입니다. 고객_주소 문서.
이제 아직 쿼리하지는 않겠지만, 이러한 문서는 각각 하나의 행에 해당하는
관계형 데이터베이스를 사용합니다. 예를 들어 고객 MySQL 테이블은
카우치베이스.
아주 비슷하죠?
문서 삽입
여기서부터 MySQL과 상황이 매우 달라질 수 있습니다. 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": "캘리포니아" } ] } |
위 문서에서는 특정 고객의 모든 주소를 문서 내의 배열에 저장하고 있습니다. 이것은
모든 주소에 대해 새 문서를 생성하고 고객 문서를 참조합니다.
MySQL 데이터에 매우 복잡한 관계가 있는 경우 다음과 같이 변환하면 어떻게 되는지 궁금하실 것입니다.
Couchbase를 사용하면 동일한 데이터가 두 개 이상의 Couchbase 문서에 포함될 수 있습니다. 이런 일이 발생할 수 있지만
나쁜 것입니다. Couchbase와 같은 NoSQL 데이터베이스에서는 정규화된 데이터가 필요하지 않습니다. 하지만 정말 걱정된다면 다음과 같이 해 보세요.
두 가지 접근 방식을 혼합하고 싶으신가요? 다음과 같은 데이터를 보관하세요. 고객_역사 관계 없이 함께하고
더 자주 변경될 수 있는 다른 항목도 있습니다.
MySQL과 카우치베이스의 쿼리 차이점
카우치베이스 N1QL과 MySQL SQL 비교
MySQL은 다른 관계형 데이터베이스 플랫폼과 마찬가지로 자체적인 SQL을 사용합니다. 앞서 정의한 스키마를 사용한다고 가정합니다.
의 경우 다음과 같이 고객과 고객 주소를 쿼리할 수 있습니다:
1 2 3 4 5 6 |
선택 c.이름, c.성, ca.도시, ca.상태 FROM 고객_주소 ca 왼쪽 JOIN 고객 c 켜기 ca.customer_id = c.id |
이제 Couchbase NoSQL 데이터로도 거의 동일한 작업을 수행할 수 있다고 하면 어떨까요? 다음 Couchbase N1QL 쿼리를 살펴보세요:
1 2 3 4 5 6 |
선택 c.이름, c.성, ca.도시, ca.상태 FROM `버킷-이름` ca 왼쪽 JOIN `버킷-이름` c 켜기 키 ca.고객_id |
크게 다르지 않죠? 우리가 사용하고 있다는 것을 알 수 있습니다. 버킷 이름
를 두 번 클릭합니다. 이는
테이블을 사용하면 모든 다른 문서와 문서 유형이 동일한 버킷에 존재하게 됩니다. 문서 키는
가치에 동참합니다.
이제 MySQL에 새 데이터를 삽입하고 싶다고 가정해 보겠습니다. 고객 테이블을 생성합니다. MySQL에서는 다음과 같은 작업을 수행할 수 있습니다:
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"}); |
Couchbase N1QL에 대한 자세한 내용은 다음을 참조하세요. 여기.
MySQL과 Couchbase의 개발 차이점
이전 글에서 오라클에서 카우치베이스로에서 Java의 관점에서 개발의 차이점에 대해 썼습니다. For
일관성을 위해 다음 예제에서는 Java를 사용하겠습니다. MySQL은 확실히 Java에만 국한되지 않으며 Couchbase도 마찬가지입니다.
MySQL JDBC 드라이버
Java 애플리케이션에서 MySQL 데이터베이스에 연결하려면 JDBC(Java 데이터베이스 커넥터) 드라이버를 사용해야 합니다.
드라이버가 프로젝트에 포함되어 있으면 Maven과 같은 도구를 통해 또는 수동으로 드라이버를 로드하고 데이터 쿼리를 시작할 수 있습니다.
예를 들면 다음과 같습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
클래스.forName("com.mysql.jdbc.Driver"); 속성 정보 = new 속성(); 정보.put("user", "nraboy"); 정보.put("비밀번호", "비밀번호"); 연결 연결 = DriverManager.getConnection("jdbc:mysql://HOST:PORT/DATABASE", 정보); 성명서 stmt = 연결.getConnection().createStatement(); 결과 설정 rs = stmt.실행 쿼리("SELECT * FROM customer"); 동안(rs.다음()) { // rs.getString("first_name"); } stmt.닫기(); |
카우치베이스 자바 SDK
Java 애플리케이션을 통해 Couchbase에 연결하려면 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을 사용하여 다운로드했다고 가정합니다.
도구의 차이점
MySQL을 사용할 때 사용할 수 있는 많은 도구가 있습니다. 예를 들어 데이터베이스에 대한 쿼리를 실행하려면 다음과 같은 도구를 사용할 수 있습니다.
를 사용할 수 있습니다. MySQL CLI. Couchbase로 전환할 때도 비슷한 도구를 계속 사용할 수 있습니다.
명령줄 도구를 찾고 있다면 다음을 사용할 수 있습니다. CBQ 를 클릭해 데이터를 쿼리하세요. 다음의 파워 유저인 경우
MySQL 워크벤치, 걱정하지 마세요. 카우치베이스에는 쿼리 워크벤치 as
의 카우치베이스 서버 4.5.
데이터 마이그레이션
데이터와 관련하여 데이터를 MySQL에서 최대한 빨리 Couchbase로 가져올 수 있는 방법이 궁금할 것입니다.
로랑 도귄은 다음과 같은 훌륭한 마이그레이션 도구를 만들었습니다. MySQL에서 카우치베이스로 데이터 이동하기.
이 도구의 기본 기능은 Java와 JDBC 드라이버를 통해 MySQL 데이터베이스에 연결하는 것입니다. 모든 테이블의 각 행은 고유한 JSON 문서로 변환됩니다.
새 JSON 문서에는 데이터베이스 제약 조건이 없지만 키는 여전히 존재하며 N1QL을 통해 쿼리할 수 있습니다.
결론
MySQL과 Couchbase는 매우 다른 두 가지 데이터베이스 기술이지만 사용 방식은 꼭 같을 필요는 없습니다. 관계형 데이터 모델
는 NoSQL 문서 데이터베이스에서도 어느 정도 보존할 수 있습니다. 그러면 저장된 모든 데이터는 다음과 같이 Couchbase에서 쿼리할 수 있습니다.
를 SQL 쿼리를 사용하여 MySQL 데이터베이스에 저장할 수 있습니다. 이 둘의 가장 큰 차이점은 저장할 수 있는 데이터에 제한이 없다는 것입니다.
저장하는 방법을 알아보세요.
Oracle 데이터베이스 사용자인 경우, 이 오라클에서 카우치베이스로의 전환에 대해 쓴 비슷한 포스팅을 참고하세요.
[...] MySQL에서 Couchbase로 이동 [...]
안녕하세요, 위의 조인 쿼리 예제에 대해 어떤 인덱스를 만들어야 하나요?
알겠습니다, 이 경우 기본 인덱스가 필요합니다.