RDBMS와 NoSQL에 대해 알아보기 전에 몇 가지 기본적인 사항을 확인하고 가자.
우선 데이터베이스(Database)
에 대해서는 여러 가지 정의가 있지만, 일반적으로 여러 사람이 공유하여 사용할 목적으로 체계화되어 통합 관리되는 데이터의 집합이며, 텍스트, 숫자, 이미지, 영상, 일반 파일 등 모든 유형의 데이터를 포함한다.
그리고 DBMS
는 DataBase Management System(데이터베이스 관리 시스템)의 약어로, 사용자와 데이터베이스 사이에서 다수의 사용자들이 데이터베이스 내의 데이터에 접근할 수 있도록 사용자 혹은 다른 프로그램의 요구를 처리하고 응답하는 시스템이다. 데이터를 만들고 저장하고 관리하는 기술로 이해하면 될 것이다.
마지막으로 SQL
은 Structured Query Language(구조적 쿼리 언어)의 약어로, 관계형 데이터베이스 관리 시스템(RDBMS)
에서 데이터를 추출하고 조작하는 데 사용되는 데이터 처리 언어이다. 데이터의 검색과 관리, 데이터베이스 스키마 생성 및 수정, 데이터베이스 객체 접근 조정 관리 등의 기능을 수행한다.
관계형 데이터베이스 관리 시스템(이하 RDBMS)은 데이터를 스키마(Schema)로 정의된 2차원 테이블 형태로 표현하는 데이터베이스이다. 각 테이블은 1개 이상의 레코드(Record)
로 구성되어 있으며, 각 레코드는 1개 이상의 속성(Attribute)
으로 이루어져 있다. 간단히 레코드를 행, 속성을 열로 이해하면 쉽다.
레코드는 한 객체에 대한 정보로서, 예를 들어 '학생' 테이블이 있을 때 '홍길동'이라는 학생 각체에 대한 정보를 의미한다. 그리고 홍길동이라는 학생의 학번, 학과, 학년, 키, 몸무게 등의 정보가 있다면 각각이 속성에 해당한다. 그리고 각 속성이 취할 수 있는 값, 예를 들어 몸무게라는 속성이 취할 수 있는 '실수'라는 값의 집합을 도메인(Domain)
이라고 한다.
RDBMS는 1개 이상의 테이블로 구성되며, 각 테이블이 다른 테이블과 관계를 갖는다는 것이 가장 큰 특징이다. 그리고 이러한 관계를 나타내기 위해 외래 키(Foriegn key)
라는 것을 사용한다.
여기서 간단히 기본 키(Primary key)
와 외래 키에 대해 짚고 넘어가자.
'기본 키'는 테이블 내에서 각각의 레코드에 대해 유일성
과 최소성
을 갖는 키로, 유일성은 각 레코드를 다른 레코드와 구분할 수 있도록 하는 성질이며, 최소성은 유일성을 얻기 위해 최소한의 속성만 필요하다는 성질이다. 앞선 학생 테이블의 예에서 '학번'은 다른 학생과 홍길동이라는 학생을 구분할 수 있도록 해 주며, 학년이나 몸무게 등의 다른 속성 없이도 학번만으로 홍길동이라는 학생을 구분할 수 있으므로 최소성을 갖는다. 즉, 학번이 기본 키에 해당한다고 할 수 있다.
반면 외래 키
는 다른 테이블의 기본 키를 참조하여 추가한 키이며, 이를 이용해 다른 테이블과의 관계성을 추가하는 것이 RBMS의 가장 큰 특징이다. '학과'라는 테이블이 존재하고, 국문학과, 영문학과, 수학과 등등의 레코드가 학과 테이블 내에 존재한다고 하자. 앞서 홍길동 학생의 소속이 국문학과라고 한다면, '학과' 테이블의 '국문학과' 레코드에 존재하는 '학과 번호'라는 기본 키를 참조하여 해당 정보를 '학생' 테이블의 '학과 번호' 속성에 추가할 수 있다. 그리고 이때 '학생' 테이블의 '학과 번호'가 외래 키가 되는 것이다.
RDBMS는 테이블 간의 관계를 설정하여 데이터를 관리함으로써 다음과 같은 장점을 갖는다.
이러한 특징으로 인해 현재 가장 많이 사용되는 DMBS 중 하나가 바로 RDBMS이다.
반면 단점도 존재한다.
NoSQL은 비관계형 데이터베이스로서 RDBMS 방식으로는 처리하기 어려울 정도로 복잡하고 큰 데이터가 등장함에 따라 점차 사용량이 늘어나고 있는 데이터베이스이다. NoSQL은 테이블 간의 관계를 정의하지 않으므로 테이블 간 Join이 불가하며, 정해진 스키마 없이 자유롭게 데이터를 저장할 수 있다.
다양한 형태(4가지)의 데이터 모델을 사용해 데이터를 표현한다.
1. Key-Value Database
NoSQL은 다음과 같은 장점을 갖는다.
반대로 다음과 같은 단점도 있다.
RDBMS | NoSQL | |
---|---|---|
데이터 저장 모델 | table | JSON document / Key-value / Graph 등 |
스키마 | - 명확한 데이터 구조 보장 - 데이터의 유연성은 낮음 | - 스키마가 없어 자유로운 데이터 구조 - 명확한 데이터 구조를 보장하지 않아 데이터 구조의 설계 및 결정은 어려움 |
확장성 | - Scale-up만을 지원해 비용이 많이 듦 | Scale-up과 Scale-out을 모두 지원하여 데이터 분산이 용이함 |
데이터 처리 | - 부하 발생 시 처리는 어려움 - 데이터의 Update는 빠름 | - 많은 양의 데이터 처리, 저장 가능 - 데이터의 Update는 비교적 느림 |
사용 | - 데이터의 구조가 명확하여 변경 여지가 없고 명확한 스키마가 중요한 경우 - 데이터의 Update가 잦은 시스템의 경우 | - 정확한 데이터 구조를 알 수 없고 데이터가 변경/확장될 수 있는 경우 - 데이터의 Update가 많이 이루어지지 않는 시스템 - 데이터의 양이 많아 데이터베이스의 Scale-out이 필요한 시스템 |
MySQL을 사용할 때 Master-Slave 구조의 이중화 구성을 하는 경우가 많다. 이는 데이터베이스에 문제가 생겼을 때 데이터가 유실될 가능성을 줄이기 위한 것인데, 여기에 필요한 것이 Replication이다.
Replication은 말 그대로 DB의 데이터를 물리적으로 다른 곳에 복제해 두는 것을 의미한다.
Master와 Slave를 각각 DB 서버라고 생각하고 각자의 역할을 이해해 보자.
MySQL에서는 오직 Master만이 데이터의 등록/수정/삭제 작업을 수행할 수 있다. Master는 상기 쿼리 요청이 발생할 경우 이를 수행하고 해당 로그를 Binary log라는 곳에 기록하는데, 이때 기록 방식은 세 가지가 있다.
Master-Slave 구조로 DB를 구성할 경우 가장 먼저 '읽기 쿼리'에 대한 트래픽을 분담함으로써 서버의 트래픽 부담을 줄일 수 있다. 또한 앞서 설명한 대로 시스템에 장애가 발생할 경우 미리 백업 용도로 사용했던 Slave DB로 대체하여 시스템을 운영할 수 있다는 장점도 있다.
다만 데이터의 동기화가 제대로 되지 않을 수도 있다는 단점이 있다. 따라서 정합성과 실시간성이 보장되어야 하는 쿼리는 Master DB로, 정합성이 다소 떨어져도 괜찮은 읽기 등의 쿼리는 Slave DB로 분산시켜야 한다.