사실 SQL(Structured Query Language)은 데이터베이스 자체를 나타내는 것이 아니라, 단지 쿼리언어이다. 그러나 관용적으로 관계형 데이터베이스
를 의미하기도 하며, 여기서도 이를 기준으로 다뤄보도록 한다.
SQL
SQL을 사용해 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장/수정/삭제 및 조회할 수 있다. 관계형 데이터베이스에는 두 가지 특징이 있다.
- 엄격한 스키마 : 스키마를 준수하지 않는 레코드는 추가할 수 없음
- 관계 : 여러 개의 테이블에 데이터를 나누어 담아, 데이터들의 중복을 피할 수 있음
장점
- 스키마가 명확하고 데이터 무결성이 보장된다.
- 각 데이터를 중복없이 한 번만 저장된다.
단점
- 상대적으로 덜 유연하다. 데이터 스키마는 사전에 계획되고 알려져야 하며, 나중에 수정하기가 번거롭거나 불가능 할 수도 있다.
- 관계를 맺고 있기 때문에, join문이 많은 매우 복잡한 쿼리가 만들어질 수 있다.
- 수평적 확장이 어렵고, 대체로 수직적 확장만 가능하다.
NoSQL
No
의 의미보다는 Not only
의 의미라는 주장이 더 강하다. 즉, SQL계열 쿼리 언어를 사용하는 게 불가한 것은 아니다. 하지만 이 글에서는 SQL과의 비교/대조 관점에서 다뤄본다. SQL과 다르게, 이러한 특징이 있다.
- 스키마 없음 : 다른 구조의 데이터를 같은 컬렉션(= SQL로 치면 테이블)에 추가할 수 있음. 스키마를 신경쓸 필요 없으며 join이라는 개념이 존재하지 않음.
- 관계 없음 : 특정 데이터를 같이 사용하는 모든 컬렉션에서, 똑같은 데이터 업데이트가 수행되어야 함
NoSQL 계열에서는 레코드를 문서(documents)라고 부르며, JSON 데이터와 비슷한 형태를 띠고 있다.
// MongoDB Document의 예시
{
"_id": ObjectId("1254910hh9s01437764230"),
"username": "phenomenon",
"name": { first: "Hyunsang", last: "Han" }
}
장점
- 스키마가 없으므로 더 유연하다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가 할 수 있다. 이에 따라 데이터를 애플리케이션이 필요로 하는 형식으로 저장함으로써 데이터를 읽어오는 속도가 빨라지게 할 수 있다.
- 수직 및 수평 확장이 가능하다.
단점
- 유연성 때문에, 데이터 구조가 명확하지 않을 수 있다.
- 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정(Update)을 해야 하는 경우 모든 컬렉션에서 해줘야 한다.