MySQL과 같은 SQL을 사용할지, MongoDB와 같은 NoSQL을 사용할지 어떻게 정할까?
프로젝트에 적합한 데이터베이스를 선택해야 할 것이다.
그러기 위해서 SQL과 NoSQL에 대해서 알아보자.
SQL(Structed Query Language)는 데이터베이스 자체를 나타내는 것이 아니라 특정 유형의 데이터베이스와 상호작용하는데 사용하는 쿼리 언어이다.
SQL을 사용하면 관계형 데이터베이스 관리시스템(RDBMS)에서 데이터를 저장, 수정, 삭제, 검색 할 수 있다.
이런 관계형 데이터베이스에는 주요한 두 가지 특징이 있다.
데이터는 테이블에 레코드로 저장되는데 각 테이블마다 명확하게 정의된 구조가 있다.
해당 구조는 필드의 이름과 데이터 유형으로 정의된다.
그렇기 때문에 스키마를 준수하지 않은 레코드는 테이블에 추가할 수가 없다.
스키마를 수정하지 않는 이상 정해진 구조에 맞는 레코드만 추가 가능한 것이 데이터베이스의 특징들 중 하나다.
데이터의 중복을 피하기 위해 관계를 이용한다.
하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어진다는 장점이 있다.
NoSQL은 기본적으로 SQL과 반대되는 접근방식을 따른다.
스키마도 없고 관계도 없다.
NoSQL에서는 레코드를 문서(documents)라고 부른다.
SQL에서는 정해진 스키마를 따르지 않으면 데이터를 추가할 수 없지만,
NoSQL에서는 다른 구조의 데이터를 같은 컬렉션(SQL에서의 테이블)에 추가할 수 있다.
문서는 JSON과 비슷한 형태를 가지고 있다.
관계형 데이터베이스처럼 여러 테이블에 나누어 담지않고 관련 데이터를 동일한 컬렉션에 넣는다.
따라서 SQL에서 Orders, Users, Products 테이블로 나눈 것을 NoSQL에서는 Orders에 한곳에 포함하여 저장하게 된다.
여러 테이블에 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 NoSQL이다.
(NoSQL에는 조인이라는 개념이 없다.)
NoSQL에서 조인하고 싶으면 어떻게 할까?
컬렉션을 통해 데이터를 복제하여 각 컬렉션의 일부분에 속하는 데이터를 정확하게 산출하도록 한다.
하지만 이렇게 하면 데이터가 중복되어 서로 영향을 줄 수 있다.
따라서 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터일 때 NoSQL을 쓰면 효율적이다.
두 데이터베이스를 비교할 때 중요한 확장(Scaling) 개념이 있다.
데이터베이스 서버의 학장성은 수직적 확장과 수평적 확장으로 나누어진다.
데이터가 저장되는 방식 때문에 SQL 데이터베이스는 일반적으로 수직적 확장만을 지원한다.
수평적 확장은 NoSQL 데이터베이스에서만 가능하다.
어떤 데이터베이스를 골라야할까?
SQL과 NoSQL 모두 좋은 솔루션이지만 하나만 골라야한다면,
어떤 데이터를 다루는지 어떤 애플리케이션에서 사용되는지를 고려해야한다.
관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
변경될 여지가 없고 명확한 스키마가 사용자와 데이터에게 중요한 경우
정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
읽기를 자주 하지만 데이터 변경은 자주 없는 경우
데이터 베이스를 수평으로 확장해야 하는 경우
제시 방법들 중 하나일 뿐이지 정답이 정해져 있는 것은 아니다.
SQL을 선택해서 복잡한 JOIN문을 만들지 않도록 설계하여 단점을 없앨 수 있고
NoSQL을 선택해서 중복 데이터를 줄이는 방법으로 설계해서 단점을 없앨 수 있다.
https://gyoogle.dev/blog/computer-science/data-base/SQL%20&%20NOSQL.html
https://siyoon210.tistory.com/130