SQL과 NoSQL의 차이는 전통적인 RDB(Relational Database; 관계형 데이터베이스)에서 시작된다. RDB의 관리 소프트웨어인 RDBMS에서 사용하는 SQL 언어의 사용 유무는 곧 RDB의 사용 유무로 확장된다. 특정 상황에서의 기존 RDB의 한계를 극복하기 위해 SQL 언어를 사용하지 않는 데이터베이스 시스템이 개발되기 시작해, 이는 곧 SQL 언어를 사용하는 DB와 SQL 언어를 사용하지 않는 DB로 구분되었다.
Database
미국은 1914년부터 1945년대 까지 1차, 2차 세계 대전을 겪으며 군수물자 무역을 통해 엄청난 부를 거머쥐었다. 1950년대 벌어들인 대규모의 군비를 집중적, 효율적으로 관리하기 위해 컴퓨터를 활용한 도서관 개념을 개발하며 Database; DB라는 개념이 탄생하게 되었다.
이후 다양한 하드웨어, 인프라적 기술이 진전됨에 따라 DB의 크기, 기능, 성능이 상승했으며, 데이터 모델이나 구조에 따라 NDB(Navigational Database), RDB(Relational Database)/SQL(Structured Query Language), ODB(Object Database)/ORM(Object Relational Mapping)/차세대 데이터베이스의 세가지 시대로 구분된다.
DB의 개념
여러 사람이 공유하고 사용할 목적으로 통합 관리되는 정보의 집합이다. 사용 목적에 따라 논리적으로 연관되어 체계화된 하나 이상의 자료 모음으로, 자료의 검색과 갱신을 효율적으로 행할 수 있게 돕는다.
DB의 존재 목적인 공동 자료로써의 효율성을 위해 가져야 하는 특징은 다음과 같다.
Real-time Accessibility(실시간 접근성): 수시적이고 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 한다.
Continuous Evolution(지속적인 변화): 데이터베이스의 상태는 동적이다. 즉 새로운 데이터의 삽입(Insert),삭제(Delete),갱신(Update)로 항상 최신의 데이터를 유지한다.
Concurrent Sharing(동시 공유): 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 한다.
Content Referance(내용에 대한 참조): 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라, 사용자가 요구하는 데이터 내용으로 데이터를 찾는다.
DBMS
사용자가 데이터베이스를 정의, 생성, 유지, 관리하기위해 접근할 수 있도록 돕는 소프트웨어이다. 다수의 사용자 또는 다른 프로그램의 요구를 처리하고 적절히 응답하여 데이터를 사용할 수 있도록 해준다.
DBMS가 제공해야 하는 기능들은 다음과 같다.
데이터 저장, 탐색, 갱신
데이터베이스의 metadata를 표현하는 Catalog나 Data dictionary 제공
트랜잭션과 동시성의 지원
데이터베이스 손상 시 회복기능
데이터 접근과 갱신에 대한 사용자의 권한 관리
원격 접속 기능
특정 규칙을 따르는 DB 내 데이터 제약 관리
RDB
Linked list 기반의 CODASYL같은 NDB가 가지는 searching의 한계점을 극복하기 위해 IBM의 Edgar Codd는 논문을 통해 Relational model(관계형 모델)을 발표하였다. free-form의 레코드가 아닌 일정한 수의 column수를 가지는 table의 형태로, row를 이루는 각 Entity의 식별자인 Primary key를 통해 Entity간의 관계를 맺고자 하였다.
RDB 용어
Column - Field 라고도 부르며, 항목의 속성(명칭)을 나타낸다. 필드 마다 각각 정수, 텍스트 같은 데이터 유형을 정할 수 있다.
Row - Record 라고도 부르며, 각 데이터 항목을 저장한다.
Schema - Field는 데이터 유형뿐만 아니라 제약사항도 지정할 수 있는데 이러한 제약사항을 스키마라고 부른다. 예컨데, Field는 중복 값을 해당 행에 저장할 수 없다거나, 반드시 값을 가져야 하는 조건 등을 걸 수 있다.
Relation
각 테이블의 Record끼리 연결되는 관계를 맺음으로써 자료의 중복 제거를 통한 공간적 효율, 자료 검색에 대한 성능의 효율을 높일 수 있다.
테이블 간 관계는 Record의 Primary key, Foreign key를 통해 일대일(1:1), 일대다(1:N), 다대다(N:M)의 관계를 이룰 수 있다.
Transaction
트랜잭션은 데이터베이스 관리시스템(DBMS)에서 하나의 작업의 단위이다. 다수의 사용자들이 동시다발적으로 행하는 작업들에 대해 데이터의 일관성과 무결성을 지켜야 하기에 트랜잭션은 모든 명령문을 완벽하게 처리하거나, 하나의 명령문이라도 문제가 발생하면 모든 명령문을 수행하지 않고 데이터를 보존한다.
트랜잭션의 기능을 제대로 수행하기 위해선 ACID라 불리는 네 가지 특성을 만족해야한다.
Atomicity(원자성): 트랜잭션이 수행하는 연산들을 모두 정상적으로 처리하거나 모두 처리하지 않는 all-or-nothing 방식이다.
Consistency(일관성): 트랜잭션이 성공적으로 수행된 이후에도 데이터베이스의 데이터는 일관된 상태를 유지해야 한다.
Isolation(격리성): 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 간섭하지 못하도록 하여 각각의 트랜잭션이 독립적으로 수행되어야 한다.
Durability(지속성): 트랜잭션이 성공적으로 완료된 이후에 데이터베이스의 데이터들은 영구적으로 보존되어야 한다.
SQL
RDBMS(관계형 데이터베이스 관리 시스템) 의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다. 관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 Schema 생성과 수정, 데이터베이스 객체 접근/조정 관리를 위해 고안되었다.
RDB는 정해진 Schema에 따라 데이터를 저장하여 명확한 데이터 구조를 보장하며 중복없이 데이터를 저장하여 공간적 효율을 높일 수 있다. 또한 트랜잭션을 통해 높은 생산성과 동시에 안정적으로 데이터를 관리할 수 있다.
하지만 빅데이터의 등장으로 데이터와 트래픽이 기하급수적으로 증가함에 따라 테이블 크기가 커지며 많은 관계가 얽히게 되었다. 이에 따라 복잡한 JOIN문이 만들어지고 성능 향상을 위한 수직적 확장인 Scale-up에 기술, 비용적 한계에 다다르게 되었다. Schema의 수정 또한 어렵고 번거로워 빅데이터를 RDB로만 처리하기 어려웠다.
이를 보안하기 위해 기존 RDB와 구조적으로 다른 Document, Key-value, Wide Column 방식의 DB가등장하게 되었다.
데이터 일관성은 포기하되 비용을 고려하여 여러 대의 서버노드에 분산하여 저장하는 Scale-out을 목표로 한 NoSQL의 등장으로 작고 값싼 장비 여러대로 대량의 데이터와 컴퓨터 부하를 처리하는 것이 가능하게 되었다.
NoSQL
전통적인 RDB보다 덜 제한적인 일관성 모델을 이용하는 DB이다. 디자인의 단순화, 수평적 확장성, 세세한 통제를 목적으로 하여 데이터의 저장 및 검색을 위한 매커니즘을 제공한다.
1998년, Carlo Strozzi가 표준 SQL 인터페이스를 채용하지 않은 자신의 경량 오픈 소스 관계형 데이터베이스를 NoSQL이라고 명명하였고, 2009년 Hypertable, HBase, Voldemort, Cassandra 등의 분산 데이터 저장 시스템을 논하는 미트업 행사에서 명칭이 널리 퍼지게 되었다.
기존 RDBMS에서 사용하던 SQL 언어를 사용하지 않아 Non-SQL이라는 이름을 가지게 되었지만, 차츰 SQL 언어를 사용하는 Non-relational DBMS가 등장하게 되며 SQL 계열 쿼리 언어를 사용할 수 있다는 사실을 강조한다는 면에서 Not-only-SQL로 불리기도 한다.
RDB의 단점을 보완하였지만, 모든 장점을 가져오지는 못했다. 상황에 따라 타협하여 채택해야 하는 시스템의 구조가 있는데, CAP 정리를 통해 직관적으로 알 수 있다.
CAP 정리
시스템은 Consistency(일관성), Availablity(가용성), Partition torlerance(분단 허용성)의 세 가지 속성중, 두 가지만 가질 수 있다는 정리이다.
이를 보완한 PACELC 이론 또한 있다. 잘 설명된 블로그를 참고하도록 하자.
많은 NoSQL 스토어들은 Availability, Partition tolerance, Performance를 선호하여 Consistency를 타협하는 AP의 구조를 보인다.
NoSQL의 종류
Key-value Database
Key와 Value로 이루어진, 저장과 조회라는 가장 간단한 원칙에 충실한 데이터베이스이다. 간단한 데이터 모델을 대상으로 데이터를 자주 읽고 쓰는 애플리케이션에 적합하며, Redis, Riak, Oracle Berkely, AWS DynamoDB 등이 있다.
Value로는 단순한 스칼라 값이 일반적이지만, 리스트나 JSON같은 구조화된 값도 가능하다.
Key-value Database의 특징은 다음과 같다.
Key-Value Database의 Key 값은 unique한 고유값으로 유지되어야 한다.
테이블간 조인을 고려하지 않으므로 RDB(Relational Database)에서 관리하는 외부키나, 컬럼별 constraints등이 필요 없다.
값에 모든 데이터 타입을 허용하며, 그래서 개발자들이 데이터 입력 단계에서 검증 로직을 제대로 구현하는 것이 중요하다.
Document-oriented Database
데이터 저장에 Key-Value Type를 사용하지만, Value를 Json, XML과 같은 문서로 저장한다. 이를 Collection-Document 데이터 모델 구조라 부르며, MongoDB나 Apache CouchDB 등이 있다.
값을 저장하기 전에 Schema를 별도로 정의하지 않으며, 문서를 추가하면 그게 바로 Schema가 된다.
각 문서별로 다른 Field를 가질 수 있으며, 사용자가 애플리케이션에서 데이터를 입력하는 단계에서 Column과 Field의 관리가 제대로 이루어지도록 보장하는 것이 매우 중요하다. 예컨데 필수 속성(Null을 허용하지 않는 속성)에 대한 관리도 애플리케이션 레벨에서 관리가 이루어져야 한다.
Wide-column Store
대용량 데이터, 읽기와 쓰기 성능, High-Availability을 위해 설계되었으며, Apache Hbase, Apache Cassandra, GCP BigTable, Microsoft Azure Cosmos DB 등이 있다. Column과 Row와 같이 Relation Database와 동일한 용어를 사용하여 Schema를 정의하지만, 관련된 Column들을 컬렉션으로 묶는 Column-family 구조를 채택함으로써 차이점을 둔다.
미리 정의된 Schema를 사용하지 않으므로 개발자가 데이터를 입력하는 시점에 원하는대로 Column을 추가할 수 있다.
테이블간 Join을 지원하지 않는다.
Graph Database
개체간 수많은 관계를 저장하고 탐색하도록 설계되었으며, Neo4j, Titan, Virtuoso 등이 있다. 그래프 이론을 바탕으로 Node, Edge, Property를 통해 연결되어 거대한 네트워크를 이루고 있어 실시간 추천엔진, 콘텐츠 및 자산관리 시스템, ID 및 엑세스 관리 시스템, 규정 준수 및 위험관리 솔루션, 소셜네트워크와 같은 관계를 보고자 할때 사용된다.