RDB vs NoSQL
RDB란?
**RDB(Relational DataBase, 관계형 데이터베이스)**란, 데이터를 테이블(행과 열이 있는 구조)의 형태로 저장을 하는 데이터베이스를 가리킨다. 이때 각 행은 primary key를 포함하는 record로, 각 열은 attribute로 표현된다. 또한, 테이블 간 공유되는 데이터를 가질 수 있는데, 이로써 테이블 간의 관계를 가질 수 있게 된다. 그리고 RDB는 실제 물리적인 스토리지 구조와 분리된 논리적 데이터 구조를 가질 수 있다. 그렇기 때문에 테이블 내부의 데이터 변경 없이 데이터베이스의 이름 등을 변경할 수 있는 것이다. 이는 데이터베이스 연산을 할 때에도 적용된다.
**Relational Database Model(관계형 데이터베이스 모델)**은 1970년 IBM의 연구실에서 E. F. Codd가 개발한 A Relational Model of Data for Large Shared Data Banks에서 소개되었다. 해당 문서에서는 아래와 같이, 데이터베이스의 확장 및 트래픽 변화로 인한 정형화된 시스템으로부터 사용자들을 보호하기 위한 관계형 데이터베이스 모델로써 제안되었다. 그리고 이를 기반으로 같은 IBM 연구실에서 1974년에 SEQUEL(Structured English QUEry Language)이 개발되었다. (원래 SQL은 SEQUEL로 불렸었다. 그래서 아마 지금도 PostgreSQL 등을 Postgre + Sequel처럼 부르는 사람이 있는 것 같다.)
a relational model of data is proposed as a basis for protecting users of formatted data systems from the potentially disruptive changes in data representation caused by growth in the data bank and changes in traffic.
This paper has presented the data manipulation facility (EMF) of a data sublanguage based on the relational model of data.
RDBMS란?
**RDBMS(Relational DataBase Management System, 관계형 데이터베이스 관리 시스템)**란, **RDB(Relational DataBase, 관계형 데이터베이스)**를 만들고 관리하는 시스템으로, RDB를 구현한 구체적인 소프트웨어 시스템이다. 또한, 데이터를 CRUD할 수 있는 인터페이스를 제공한다.
RDBMS에서 index가 무엇이고 어떻게 동작하는지?
index는 key와 value로 구성 돼 있으며, key는 검색하려는 값이고, value는 해당 key와 연결된 record의 주소이다. 즉, index를 사용하면, 검색하려는 column 값에 대한 record를 검색하는 것이 아니라, 먼저 index에서 key찾고, key로부터 value를 찾아 실제 데이터를 찾는 방식이다.
이는 B-Tree(Balanced Tree의 한 종류, 디스크 상에 index 저장에 적합) 혹은 B+Tree(디스크 I/O 최소화)로 구현된다.
index는 일반적으로 쓰기속도를 지연시키는 대신, 검색속도를 높이기 위해 사용하는 데이터 구조이다. 보통 WHERE
문에서 사용된다. index를 생성하면 데이터베이스의 추가적인 공간을 사용하기 때문에 필요한 column에서만 index를 생성해야 한다.
NoSQL Database란?
NoSQL(Not Only SQL 혹은 non-SQL) Database란 비관계형 데이터베이스로, 기존의 RDBMS에서 사용하던 테이블 등의 개념을 사용하지 않는 모든 데이터베이스를 가리킨다.
NoSQL에서는 일반적으로 key-based lookup 형태로 value를 조회한다.
NoSQL의 종류
key-value 저장소
NoSQL의 가장 단순한 형태의 저장소이다. 각 key에 해당하는 value는 binary 형태로 저장이 되는데, 이 value가 내부적으로 어떤 구조를 가지고 있는지에 대해 관여하지 않고 binary로만 값을 취급한다. 가장 단순하지만, 속성 필터링 등의 기능을 제공되지 않는다. 예시로 AWS DynamoDB가 있다.
하지만, 데이터베이스 수준에서 attribute에 기반한 filtering을 지원하지 않는다. DynamoDB의 경우, Filter Expression을 통해 Query로부터 원하는 결과를 가져올 수 있긴 하지만, 전체 value를 가져온 다음 filtering이 수행되기 때문에 동일한 Read 횟수가 요청된다. (A filter expression is applied after a Query finishes, but before the results are returned. Therefore, a Query consumes the same amount of read capacity, regardless of whether a filter expression is present.)
따라서 key-value 형태의 저장소를 사용할 경우, 정말 단순한 key-value 형태로 저장할 때 사용하는 것이 적합하다.
key-data structure 저장소
value를 자료구조(ex. integer, string, list, set, sorted set, ...
) 형태로 저장할 수 있는 저장소이다. 예시로 Redis가 있다.
자료구조 형태로 저장되기 때문에, 각 자료구조의 기능을 활용할 수 있다는게 특징이다. 가령, list
타입인 경우, push
, pop
등의 작업이 가능하다.
SQL 기반의 데이터베이스에서는 각 transaction간의 ACID 속성이 보장된다. 대부분의 NoSQL에서는 이러한 ACID 속성을 완벽히 제공하기 보다 실행 성능 을 우선시한다.
그런데 Redis의 경우, ACID 속성을 살펴볼 수 있다. MULTI를 통해 여러 명령어들이 Queue에 저장돼 순차적으로 Atomic 하면서 동시에 일관되게(Consitency) 수행될 수 있다. 또한, WATCH의 경우, **check-and-set (CAS)**을 지원함으로써, 데이터베이스 수준의 locking을 제공한다.(Isolation)
key-document 저장소
value를 JSON과 같은 document 형태로 저장할 수 있는 저장소이다. 예시로 MongoDB가 있다.
MongoDB에서는 각 document 전체를 스캔할 필요없이, 인덱스를 사용해 document를 찾을 수 있다. 또한, key-based lookup외에 각 document 및 내부 배열의 key 또한 인덱싱 할 수 있기 때문에, 데이터를 인덱싱할 때, 개수에 상관없이 key를 활용할 수 있다. 이로 인해, 복잡하고 중첩된 구조에서도 효율적인 쿼리 성능을 유지할 수 있다.
Schema란?
RDBMS에서 데이 터가 어떻게 구조화 되는지를 정의하는 일종의 "설계도"로, 테이블 명, 필드, 데이터 타입, 다른 Entity와의 관계 등을 정의한다. 하지만 실제 데이터를 저장하지는 않는다. 업데이트마다 변경되는 Database Instance와 달리 잘 변경되지 않는다.
NoSQL에 대한 오해
NoSQL을 schemaless라고 표현하는데, 이는 스키마가 없다는 뜻이 아니다. RDBMS에서와 같이 정형화된 스키마가 없는 유연한 구조를 가진다는 뜻이다. MongoDB에서는 아래와 같이 기술했다.
따라서 NoSQL의 경우, 나름대로의 구조가 있는 key-document 저장소 등과 같은 경우에도 같은 collection 내의 document라고 해도, 꼭 동일한 속성을 가질 필요는 없다. (물론 자유로운 대신 보다 개발자들이 방어적으로 개발해야 하는 부담이 늘어날 순 있다.)