관계형 데이터베이스 vs 비관계형 데이터베이스
데이터베이스
필요성
In-Memory
JavaScript에서 변수를 만들어 저장한 경우, 프로그램이 종료될 때 해당 프로그램이 사용하던 데이터도 사라진다. 이 말은 변수 등에 저장한 데이터가 프로그램의 실행에 의존한다는 것이다. 예기치 못한 상황으로부터 데이터를 보호할 수 없고, 프로그램이 종료된 상태라면 데이터를 원하는 시간에 받아올 수 없으며, 데이터의 수명이 프로그램의 수명에 의존하게 된다.
File I/O
파일을 읽는 방식으로 작동하는 형태. 엑셀 시트나 CSV 같은 파일의 형태는 In-Memory에 비해 데이터를 저장하는 방식으로 적절해 보이지만 한계가 존재
- 데이터가 필요할 때마다 전체 파일을 매번 읽어야 함. 파일의 크기가 커질수록 이 작업은 버겁고, 비효율적이어서 File I/O 방식의 큰 단점
- 파일이 손상되거나 여러 개의 파일들을 동시에 다뤄야 하거나 하는 등 복잡하고 데이터량이 많아질수록 데이터를 불러들이는 작업이 점점 힘들어진다.
SQL
하나의 언어인 Structured Query Language (SQL)은 데이터베이스 언어로, 주로 관계형 데이터베이스에서 사용한다. 예를 들어 MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 SQL 구문을 사용할 수 있다.
SQL이란 데이터베이스 용 프로그래밍 언어. 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다. 그리고 SQL은 (relation 이라고도 불리는) 데이터가 구조화된(structured) 테이블을 사용하는 데이터베이스에서 활용할 수 있다.
SQL을 사용할 수 있는 데이터베이스와 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 한다. 관계형 데이터베이스와는 달리, 테이블을 사용하지 않고 데이터를 다른 형태로 저장한다. NoSQL의 대표적인 예시는 MongoDB 와 같은 문서 지향 데이터베이스.
쿼리
질의문. 데이터를 필터하기 위한 질의문. 데이터베이스에서 검색할때 사용.
트랜잭션
여러 개의 작업을 하나로 묶은 실행 유닛. 묶여 있는 모든 작업을 다 완료해야 정상적으로 종료되며, 하나라도 작업이 실패하면 모든 작업을 실패한 것으로 판단.
ACID
트랜잭션의 안전성을 보장하기 위해 필요한 성질
- Atomicity(원자성): 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 한다.
- Consistency(일관성): 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.
- Isolation(격리성, 고립성): 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다.
- Durability(지속성): 트랜잭션이 성공적으로 수행되었다면 로그가 남아야 한다. 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 한다.
SQL(구조화 쿼리 언어) vs NoSql(비구조화 쿼리 언어)
관계형 데이터베이스
SQL을 기반으로 데이터를 다룬다. 테이블의 구조와 데이터 타입 등을 사전에 정의하고, 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있다. 행(row)과 열(column)로 구성된 테이블에 저장.
- 행: 각 열의 데이터 형식에 맞는 데이터 저장
- 열: 하나의 속성에 대한 정보 저장
관계형 데이터베이스는 SQL을 활용해 원하는 정보를 찾을 수 있고, 테이블 간의 관계를 직관적으로 파악하기 쉽다.
NoSQL
비관계형 데이터베이스의 구성
- Key-Value 타입: 속성을
Key-Value
의 쌍으로 나타내는 데이터를 배열의 형태로 저장. Key는 속성, Value는 속성에 연결된 데이터 값. ex) Redis, Dynamo - 문서형(Document) 데이터베이스: 데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스. JSON과 유사한 형식의 데이터를 문서화하여 저장. 각 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리. ex) MongoDB
- Wide-column 데이터베이스: 데이터베이스의 열(column)에 대한 데이터를 집중적으로 관리. 각 열에는 Key-Value 형식으로 데이터가 저장되고, 컬럼 패밀리(column families)라고 하는 열의 집합체 단위로 데이터 처리. 하나의 행에 많은 열을 포함할 수 있어 유연성이 높다. 데이터 처리에 필요한 열을 유연하게 선택할 수 있어 규모가 큰 데이터 분석에 주로 사용됨. ex) Cassandra, HBase
- 그래프(Graph) 데이터베이스: 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스. 노드에 속셩별로 데이터 저장. 각 노드 간 관계는 선으로 표현 ex) Neo4J, InfiniteGraph
SQL 기반 데이터베이스와 NoSQL 데이터베이스의 차이점
- 데이터 저장
- NoSQL은 Key-Value, document, wide-column, graph 방식으로 데이터 저장
- 관계형 데이터베이스는 SQL을 이용해서 테이블에 데이터 저장. 정해진 형식에 맞게 저장해야 함
- 스키마
- SQL을 사용하려면, 고정된 형식의 스키마 필요. 스키마 수정시 데이터베이스 전체를 수정하거나 오프라인으로 전환해야 함.
- NoSQL은 동적으로 스키마 형태 관리할 수 있다. 행을 추가할 때 즉시 새로운 열을 추가할 수 있고, 모든 열에 데이터를 반드시 입력하지 않아도 된다.
- 쿼리
- 관계형 데이터베이스는 테이블의 형식과 테이블 간의 관계에 맞춰 데이터 요청. 구조화된 쿼리 언어 사용
- 비관계형 데이터베이스는 데이터 그룹 자체를 조회.
- 확장성
- 관계형 데이터베이스는 수직적으로 확장(높은 메모리, CPU 확장). 하드웨어의 성능을 많이 이용해서 비용이 많이 든다.
- 비관계형 데이터베이스는 수평적으로 확장(값싼 서버 증설, 클라우드 서비스 확장). 수직적 확장보다 상대적으로 적은 비용
관계형 데이터베이스를 사용하는 케이스
- 데이터베이스의 ACID 성질을 준수해야 하는 경우(전자상거래, 모든 금융 서비스)
- 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우
비관계형 데이터베이스를 사용하는 케이스
- 데이터의 구조가 거의 또는 전혀 없는 데용량의 데이터 저장
- 클라우드 컴퓨팅 및 저장 공간을 최대한 활용하는 경우
- 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트하는 경우
어느 유형이 더 좋다기 보단 다양한 사례를 살펴보고 적절한 데이터베이스를 선택하는 것이 중요