현재 MySQL을 사용하여 프로젝트를 진행하고 있는데, 처음 프로젝트를 설계할 때 얘기나왔던 PostgreSQL에 대해 찾아보니 SQL과 NoSQL을 모두 지원한다는 것을 알게 되었다. NoSQL에 대한 개념을 Json쿼리로만 가볍게 이해하고 있었는데 이번 기회에 정리하고자 한다.
프로젝트에 있어 적합한 데이터베이스를 선택하는 것은 매우 중요하다. 단순히 프레임워크에 따라 결정하지 말고, 두 SQL의 차이를 이해하여 결정해야 한다.
SQL이란
- 관계형 데이터베이스
- RDBMS에서 데이터를 저장, 수정, 삭제, 검색 가능
- 데이터는 정해진 스키마에 따라 테이블에 저장
- 데이터는 관계를 통해 여러 테이블에 분산
따라서 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다.
또한 중복을 피하기 위해서 '관계'라는 개념을 이용한다.
NoSQL이란
- 비관계형 데이터베이스
- 스키마, 관계 모두 없음
- 다른 구조의 데이터를 같은 컬렉션에 추가 가능
- 관련 데이터를 동일한 컬렉션에 추가
- 문서는 Json과 비슷한 형태
만약 NoSQL 환경에서 위와 하나의 Json으로 작성되면, SQL에서는 모두 관계로 묶여 다른 테이블로 만들어진다. 즉, 여러 테이블에 조인할 필요 없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 NoSQL이다.
🙋🏻♀️ 그럼 NoSQL은 조인을 못하나요?
방법은 있다. 컬렉션을 통해 데이터를 복제한 뒤, 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하면 된다. 하지만 이 방법은 데이터 중복되어 서로 영향을 줄 위험이 있다. 따라서 조인을 사용하지 않고 자주 변경되지 않는 데이터일 때 NoSQL을 쓰는 것이 좋다.
SQL을 사용하는 게 더 효율적인 경우
- 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션일 때
- 명확한 스키마가 사용자와 데이터에게 중요할 때
NoSQL을 사용하는 게 더 효율적인 경우
- 정확한 데이터 구조를 알 수 없거나 계속 변경/확장될 때
- 읽기는 자주 하지만, 데이터 변경은 자주 없을 때
- 데이터베이스를 수평으로 확장해야 할 때
결론
종류 | 장점 | 단점 |
SQL | 1. 명확하게 정의된 스키마 2. 데이터 무결성 보장 3. 데이터를 중복없이 한 번만 저장 |
1. 낮은 유연성 2. 관계가 커질 수록 조인문이 복잡해짐 3. 대체로 수직적 확장만 가능 |
NoSQL | 1. 높은 유연성. 언제든 저장된 데이터를 조정하고 새로운 필드 추가 가능 2. 데이터 리딩 속도 증가 |
1. 유연성으로 인해 데이터 구조 결정 딜레이 2. 데이터 중복을 주기적으로 업데이트 3. 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행 |
수직적 확장: 단순히 데이터베이스 서버의 성능을 향상시키는 것 (CPU 업그레이드)
수평적 확장: 더 많은 서버가 추가되고, 데이터베이스가 전체적으로 분산
SQL 데이터베이스는 일반적으로 수직적 확장만 지원하며, NoSQL은 두 확장 모두 지원한다.
참고
https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html