데이터베이스
출처 : https://devuna.tistory.com/25
관계형 DB
엄격한 스키마
데이터는 테이블과 레코드로 저장되며, 각 테이블에는 명확하게 정의된 구조가 있다. 데이터 베이스 스키마를 준수하지 않는 레코드는 추가할 수 없다.
관계
데이터의 중복을 피하기 위해, 데이터들을 여러 테이블로 나누어서 저장한다. 데이터가 항상 하나의 테이블에서만 관리되기 때문에 잘못된 데이터가 테이블 전체에 복제되어 발생하는 문제가 없다.
NoSQL
NoSQL은 기본적으로 SQL 데이터베이스와 반대되는 접근 방식을 따르기 때문에 붙여진 이름이다.
이 두가지가 NoSQL을 요약한 것
SQL에서는 정해진 스키마를 따르지 않는다면 데이터를 추가할 수 없었지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가할 수 있다.
또 일반적으로 관련된 데이터를 동일한 컬렉션에 넣는다. 데이터를 정규화해서 분리하여 저장하여 중복을 제거하지 않는다.
따라서 조회시 여러 테이블을 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 만들게 된다. 실제로 NoSQL에는 조인이라는 개념이 없다. 조인을 하고 싶다면 수동으로 직접 외래키를 검색하여 할 수 있겠지만, 일반적이지 않다.
대신 컬렉션마다 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 생성한다.
데이터가 중복된다면 여러 문제가 발생할 수 있다. 여러 곳에 중복 저장된 데이터가 정합성이 깨질 수 있으므로, 똑같은 모든 데이터에 대해 업데이트가 수행되도록하는 것이 우리의 임무이다.
그럼에도 불구하고 NoSQL의 가장 큰 장점은 복잡한 조인문으로 작업할 필요가 없으므로 조회성능이 좋다는 것이다.
필요한 모든 데이터가 이미 저장되어 있기 때문이다.
따라서 NoSQL은 자주 바뀌지 않는 데이터일 때 (조회가 자주 일어나는 데이터일때, 데이터 수정작업이 필요없는) 사용하면 좋다.
수직 수평적 확장
- 수직확장이란 단순히 데이터베이스의 성능을 업그레이드 시키는 것, scale up
- 수평확장이란 더 많은 서버가 추가되고 데이터 베이스가 전체적으로 분산되는 것을 의미. 따라서 하나의 데이터베이스에서 작동하지만, 여러 호스트에서 작동한다. scale out
- 데이터가 저장되는 방식때문에 일반적으로 SQL은 수직적 확장만을 지원
- 수평확장은 NoSQL 데이터베이스에서만 가능
- SQL 데이터베이스는 샤딩의 개념을 알고있지만, 특정 제한이 있으며 이를 일반적으로 구현하기 어려움
- NoSQL에서는 이를 기본적으로 지원하므로 여러 서버에서 데이터베이스를 더 쉽게 분할할 수 있다.
SQL, NoSQL 장단점
SQL
장점
- 명확하게 정의된 스키마, 데이터 무결성 보장
- 관계를 통해 각 데이터를 중복없이 한번만 저장 가능
단점
- 상대적으로 덜 유연, 데이터베이스 스키마를 미리 알고 계획해야한다. (나중에 수정하는 것이 어렵거나 불가능)
- JOIN문이 많은 매우 복잡한 쿼리가 만들어질 수 있음
- 수평확장이 어렵고 보통 수직확장만 가능, 즉 어느 시점에서 처리량/처리 능력과 관련하여 약간의 성장 한계에 직면할 수 있음
NoSQL
장점
- 스키마가 없기 때문에 유연성 높음. 즉 저장된 데이터를 언제든지 조정하고 새로운 필드 추가 가능
- 데이터는 애플리케이션에서 필요한 형식으로 저장. 이렇게 하면 조회 속도 빨라진다.
- 수직 및 수평확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기 쓰기 요청을 처리할 수 있음
단점
- 유연성 때문에 데이터 구조 결정이 늦어질 수 있음 (바로 계획 결정하는 것이 아니기 때문)
- 복사된 데이터가 변경되면 여러 컬렉션(테이블)과 문서를 수정해야함
각각 사용하기 좋은 경우
SQL
- 앱의 여러 부분에서 관련된 데이터가 비교적 자주 변경되는 경우 (NoSQL이라면 항상 여러 컬렉션을 수정해야한다.)
- 명확한 스키마가 중요하며, 데이터 구조가 극적으로 변경되지 않는경우
NoSQL
- 정확한 데이터 요구사항을 알 수 없거나, 관계를 맺고있는 데이터가 자주 변경(수정)되는 경우
- 읽기(read)처리를 자주하지만, 데이터를 자주 변경하지 않는 경우 (즉, 한번의 변경으로 수십개의 문서를 수정할 필요가 없는 경우)
- 데이터베이스를 수평적으로 확장해야하는 경우 (즉, 막대한 양의 데이터를 다뤄야하는 경우, 읽기 쓰기 처리량이 큰 경우)