공부기록
SQL DB VS NOSQL DB 본문
- SQL DB
SQL은 Structured Query Language의 약자이며 그 자체로 DB는 아니지만, SQL을 통해서만 특정한 종류의 DB와 상호작용 할 수 있다. SQL은 RDBMS (관계형 데이터 베이스)로부터 CRUD기능을 가능케 한다.
이러한 DB는 2개의 특징을 가지고 있다.
1. 데이터 베이스에 저장된 데이터들은 엄격한 데이터 스키마를 따른다.
2. 데이터는 여러 개의 테이블들로 나누어지고 관계들을 통해 연결된다.
- 엄격한 스키마
데이터는 테이블에 레코드로써 저장되고 각 테이블은 명확히 정의된 구조를 가진다 - 속성값의 집합으로 인해 어떤 데이터가 이 테이블에 저장이 될 지 말지가 정해지게 된다.
구조는 필드의 이름과 자료형에 따라 정의된다.
당신은 이 스키마를 따르지 않는 레코드를 추가할 수 없다.
- 관계
SQL 기반 데이터베이스의 또 다른 중요한 점은 관계이다.
당신은 테이블을 여러개로 나누어 데이터의 중복을 막는다. 따라서 당신은 Users, Products, Orders 테이블들이 다른 테이블들에는 존재하지 않는 데이터를 가지고 있음을 볼 수 있다.
이 명확한 구조는 다음과 같은 장점을 가진다. 당신은 어떠한 테이블에도 부정확한 데이터를 가지지 않고 모든 테이블들에 정확한 데이터를 가지게 된다. 데이터가 항상 오직 하나의 테이블에서 관리되기 때문에, 데이터가 테이블들 사이에서 중복이 일어나지 않는다.
- NoSQL Databases
NoSQL은 SQL 데이터베이스의 반대의 접근법을 가지기에 이렇게 이름지어졌다.
1. 스키마가 없다.
2. 관계가 없다.
요약하자면 위와 같다.
대신, 당신은 collection으로 당신의 데이터를 구조화 할수 있다. collection은 SQL의 테이블과 같다. 레코드들은 이제 document라고 불린다.
하지만 이름이 다른 것 말고, 큰 차이점이 있다. 당신은 서로 다른 구조를 가진 데이터들을 같은 콜렉션에 넣을 수 있다. 당신은 SQL에서는 그러한 것을 할 수 없다. 각 테이블이 명확한 구조를 가지기 때문이다.
document는 json 데이터와 비슷하게 생겼다. 그리고 당신은 어떠한 스키마에 대해서 신경 쓸 필요도 없다.
추가적으로, 당신은 보통 관련된 데이터들은 같은 콜렉션에 넣게 된다. 그래서 만약 당신이 여러개의 order을 받게 되면, 당신은 당신의 order document들을 당신이 보통 질의하는 모든 데이터를 담아서 Orders 콜렉션에 넣을 것이다.
따라서 당신은 document에 당신이 필요한 모든것을 넣게 될 것이다. 여러 개의 테이블/콜렉션들을 조인할 필요가 없다.
실제로, NoSQL 데이터베이스들은 테이블/콜렉션을 조인하는 개념이 없다.
당신은 직접 조인을 할 수도 있지만, 그것은 일반적인 사용 방식이 아니다. 대신에, 당신은 콜렉션 사이에서 데이터를 중복함으로써 필요한 데이터를 산출해 낸다.
데이터 중복의 개념은 처음에는 불안해 보인다. 콜렉션 A의 데이터를 업데이트 하면서 콜렉션 B의 데이터는 업데이트하지 않는 실수를 일으킬 위험이 있기 때문이다. 모든 컬렉션들이 올바른 데이터 업데이트를 하도록 보장하는 것은 당신의 일이 된다.
하지만 가장 큰 장점은 당신이 복잡한 join연산을 할 필요가 없다는 것이다. 당신이 필요하는 모든 데이터들이 이미 저장된다. 이것은 잘 바뀌지 않는 데이터들에 굉장히 적합하다.
- Vertical & Horizontal Scaling
데이터 베이스를 비교하면서 보아야 할 또다른 중요한 개념이 있다. 확장성이다.
데이터 베이스를 확장할 때 vertical scaling과 horizontal scaling으로 구분할 수 있다.
1. Vertical Scaling : 데이터베이스 서버의 가용성을 늘리는 것을 말한다. 예를 들어 CPU를 업그레이드 하는 것이다.
2. Horizontal Scaling : 다른 서버머신을 더해서 데이터 베이스를 분산하는 것을 말한다. 따라서 당신은 하나의 데이터베이스를 다루지만, 여러 개의 서버로부터 데이터베이스를 불러오는 것이다.
데이터가 저장된 방식에 따라 (related tables vs unrelated collections), SQL 데이터데이스들은 보통 vertical scaling만을 지원한다. horizontal scaling은 NoSQL DB에서만 사용가능하다.
- 정리
유형 | SQL | NoSQL |
장점 | 명확히 정의된 스키마 덕분에 데이터 무결성이 모장된다. 테이블 간의 관계가 각 데이터를 오직 한 번 저장되도록 한다. 중복이 없다. |
스키마가 없어서 유연하다 - 당신은 언제든 저장된 데이터를 조정하고 새로운 필드를 만들 수 있다. 데이터가 당신의 응용이 필요한 대로 형식을 취할 수 있다 - join연산이 없어data fetching이 빨라진다. 수직적, 수평적 확장이 가능해지며 어떠한 양의 읽기/쓰기 요청에도 DB가 처리할 수 있다. |
단점 | 유연하지 못하다. 데이터 스키마가 미리 알려지고 정해져야 한다. - 추후에 이것을 바꾸는 것은 매우 어렵거나 불가능 할 수도 있다. 테이블간의 관계가 수 많은 복잡한 JOIN 연산을 야기할 수 있다. 수직적 확장만이 가능하기에, 서버를 확장하는데 한계가 있다. |
유연성이 당신이 데이터 정의와 처리를 명확하지 못하게 할 수 있다. 중복된 데이터는 데이터가 변경될 때 여러 개의 콜렉션과 도큐먼트를 업데이트 해야함을 의미한다. 비효율적 |
최적인 상황 | 변경이 자주 일어나는 데이터 명확한 스키마가 중요하며, 데이터 구조가 극적으로 변하지 않을 때 |
명확한게 데이터 형식을 알 수 없을 때 (모르거나, 변경됨) 읽기를 자주하고 데이터를 자주 바꾸지 않을 때 데이터베이스를 수평적 확장할 필요가 있을 때 |
- 출처
https://academind.com/tutorials/sql-vs-nosql/