NoSQL vs RDBMS
Database
컴퓨터 시스템에 전자 방식으로 저장된 정보들의 집합이다. 여러 사람에 의해 공유되어 사용될 목적으로 통합 관리하는 데이터의 집합이다. 즉 컴퓨터 시스템으로 저장되는 정보, 데이터들의 집합이라는 소리이다.
DBMS (DataBase Management System)
사용자와 DB 사이에서 사용자의 요청을 해석하여 데이터를 생성하고, DB에 저장된 정보를 관리할 수 있도록 하는 소프트웨어이다. 즉 DDL과 DML, DCL을 통해 DB를 조작할 수 있는 시스템이다.
SQL (Structured Query Language)
RDBMS에 저장된 데이터를 관리하기 위해 설계된 프로그래밍 언어이다. DDL, DML, DCL이 있다.
스키마
DB를 구성하는 개체(Entity), 속성(Attribute), 관계(Relationship) 및 제약 조건 등에 관해 전반적으로 정의한 메타데이터의 집합이다. 각 테이블 사이의 관계를 나타내는 ER-DIAGRAM으로 표현한다. 사용자는 데이터를 CRUD할 때 자신이 생성한 스키마를 참조해서 명령을 수행한다.
RDBMS (Relational DataBase Management System)
관계형 모델을 기반으로 하는 DBMS의 한 유형이다.
- 엑셀과 유사한 형식의 2차원 테이블에 데이터를 정의하고 저장, 관리를 한다. 데이터의 정의, 저장, 관리에 사용하는 것이 SQL일 뿐이다.
- 테이블은 속성(Attribute, Column)와 값(Value, Row)를 갖고 있다.
- 각각의 테이블은 서로 관계(FK)를 맺으며 존재한다.
- 테이블의 정의 관계를 나타내는 스키마에 따라 데이터를 저장한다.
- 수직적인 확장이다. 이건 성능을 업그레이드 하는건데 매우 힘들다. 비용적으로..
- ACID 특성을 따른다.
- RDBMS는 MySQL, Oracle, MSSQL이 있다.
NoSQL(Not Only SQL)
비관계형 DB이다.
- 데이터,테이블 간의 관계를 정의하지 않는다. 즉, 스키마가 없다.
- 자유롭게 데이터를 저장할 수 있다.
- 빅데이터를 다루게 되면서 용량이 큰 데이터를 관리하기 위해 등장하였다.
- 수평적인 확장이다. 즉 서버를 추가해 서버를 전체적으로 분산한다. 비용적으로 유리하다.
- 정규화를 할 필요가 없다. 애초에 안한다.
- CAP 이론을 따른다.
- 분산 시스템에서 CAP의 3가지 속성을 모두 만족하는 것은 불가능하며, 2가지만 만족할 수 있다.
- Consistency (일관성) : 모든 요청은 최신 데이터 또는 에러를 응답받는다. DB가 3개로 분산됐을 때, 하나의 DB에서 데이터가 수정되면 나머지 2개의 DB에서도 수정된 데이터를 응답받아야 한다. 즉 데이터와 DB의 상태, 제약조건 등이 항상 일관되어야 한다는 것이다.
- Availability (가용성) : 모든 요청은 정상 응답을 받는다. 특정 DB에 장애가 발생해도 서비스가 가능해야 한다.
- Partitions Tolerance (분리 내구성) : DB간 통신이 실패해도 시스템은 정상 작동한다.
Key-Value DB
- 데이터와 Key와 Value 쌍으로 저장한다.
- Value는 어떤 형태의 데이터도 가능하다. (이미지, 비디오 포함)
- 검색, 질의 속도가 매우 빠르다.
- 대량의 데이터를 저장해야 하지만 검색을 위해 복잡한 쿼리를 수행할 필요가 없는 사용 사례에 적합하다. 일번적인 사용자 선호도 저장 또는 캐싱에 사용된다.
- Redis, Riak, Amazon Dynamo DB가 있다.
Document DB
- 데이터를 Key와 Document 형태로 저장한다.
- Key-Value 모델과 달리 Value가 계층적인 형태의 Document로 저장된다.
- 이 Document는 객체지향에서의 객체와 유사하여 하나의 단위로 취급된다.
- Key-Value와 마찬가지로 검색 속도가 매우 빠르다.
- 검색,질의 결과는 Json이나 Xml 형태로 출력한다.
- 사용이 번거롭고 쿼리가 SQL과 다르다는 단점이 있다.
- B 트리 인덱스를 사용한다.
- MongoDB, CouthDB가 있다.
Wide Column DB
- Column-family Model 기반이다.
- Key-Value에서 한 단계 발전된 형태이다.
- Row 단위 저장소이며 Row Key는 Row 식별자로써 값 순으로 자동 정렬되며, 검색시 사용되는 기본 키이다.
- Column은 은 키-값 쌍이다. 하나의 Row에 수백만 - 수억개의 컬럼을 허용한다. 그리고 항상 Timestamp 값이 같이 저장된다.
- Column의 값이 다시 여러개의 Column의 Map으로 구성되어 있으면 이를 Column-Family라고 한다.
- Key-Value를 이용해 필드를 결정한 이전의 모델과 달리 키에서 필드를 결정한다.
- 키는 위에서 말했뜻이 Row, Column-family, Column-name으로 구성된다.
- 연관된 데이터는 같은 Column-family 안에 있으며 각자의 Column-name이 있다.
- RDBMS로 설명하면 attribute(column)이 계층적인 구조를 가진 것이다.
- 질의, 검색은 Row, Column-Family, Column-name을 통해 수행된다.
- 쓰기에 최적화된 모델이다. 예시로 채팅 내용 저장, 실시간 분석을 위한 데이터 저장소에 사용된다.
- HBase, Hypertable이 있다.
- 예시로 UserProfile이라는 Row에 다시 Bob이라는 Column-family 그리고 email이라는 column-name 과 같이 계층적으로 되어있다.
Graph
- Node, Edge, Property를 사용하여 데이터를 그래프 구조로 표현하고 저장한다
- 개체와 관계를 그래프 형태로 표현한다.
- RDBMS와 같이 ACID를 지원한다.
- 데이터 간의 관계가 탐색의 키일경우 적합하다.
- SNS에서 친구의 친구를 찾거나 연관 데이터를 찾는 데에 쓰인다.
- Neo4J가 있다.
장단점
RDBMS
장점
- 정해진 스키마에 따라 데이터를 저장해 명확한 데이터 구조를 보장한다.
- 중복없이 1번만 저장한다.
- 분류,정렬,탐색 속도가 빠르다.
단점
- 테이블 관계가 복잡하면, Join이 많은 복잡한 쿼리가 만들어진다.
- 성능 향상을 위해 수직적 확장을 해야하는데 이에 대한 비용이 크다.
- 지켜야할 스키마로 데이터가 유연하지 않다. 즉 스키마가 변경되기 어렵다.
결론
데이터 구조가 명확하고, 스키마가 변경될 여지가 없을 때 사용한다.
데이터의 변경이 잦은 시스템에 적합하다.
NoSQL의 장단점
장점
- 스키마가 없기 때문에 유연하고 자유롭게 데이터 저장이 관리하다.
- 복잡도가 낮기 때문에, 대용량의 데이터를 저장하고 관리 가능하다.
- 데이터 분산이 가능하기 때문에 수평적 확장으로 큰 비용없이 성능을 향상할 수 있다.
단점
- 데이터의 중복이 발생할 수 있고, 중복된 데이터가 변경되면 해당 데이터가 있는 모든 컬렉션을 수정해야 한다. 따라서 update 속도가 느리다.
- 명확한 데이터 구조를 보장하지 않는다.
결론
중복 데이터 수정 문제 때문에 update가 많지 않은 시스템에 적합하다.
분산으로 인한 수평적 확장이 가능해 빅데이터에 적합하다. 명확한 데이터 구조를 알 수 없고, 데이터가 확장될 수 있을때 사용한다.