관계형 DB
Mysql, Oracle, Mssql 등의 DB를 관계형 DB라 한다. 테이블로 이루어 져있고, 이 테이블이 다른 테이블과 관계를 맺고 모여있는 집합체로 이해할 수 있다.
장점
- 데이터의 무결성을 보장한다.
- 각 데이터는 중복 없이 한 번만 저장된다.
- 데이터베이스를 추가하기 전에 유효성 검사를 통해 데이터 품질을 향상시킬 수 있다.
- VIEW를 이용한 보안 설정이 가능하기 때문에 허가를 받지 않은 사용자들로부터 데이터의 조회, 변경 및 삭제를 막을 수 있다.
- 관계형 데이터베이스들은 같은 오픈 소스를 공유하는 경우가 많기 때문에 다른 개발 환경에서도 쉽게 적응할 수 있다.
단점
- 관계를 맺고 있기 때문에 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있다.
- JOIN이 많고 복잡한 쿼리가 만들어졌을 경우, 수정이 번거롭거나 불가능한 경우가 생긴다.
- 데이터베이스의 모델링이 개발 전에 완료되어야 하기 때문에 개발 속도를 더디게 만들 수 있다.
- 수평적 확장이 어렵고, 대체로 수직적 확장만 가능하기 때문에 데이터 처리량 성장에 한계가 있다.
- 가변성이 있는 데이터의 경우, 테이블에 저장하는 것이 쉽지 않다.
비관계형 DB
빠른 속도로 증가하는 대량의 비정형 데이터를 처리하는데 비효율적인 관계형 DB의 문제점을 해결하기 위해 등장하였다. 관계형 DB의 안정성, 일관성유지를 포기하고 데이터 구조를 미리 정해두지 않기 때문에 비정형 데이터를 저장하고 처리하는데 적합하다.
장점
- 데이터 모델링이 완료되기 이전에도 테스트 데이터의 조회가 가능하다.
- 스키마가 없기 때문에 훨씬 더 유연하다. 언제든지 저장한 데이터를 조정할 수 있다.
- 다양한 가변성이 있는 데이터의 저장이 쉽다.
- 데이터가 애플리케이션이 필요로 하는 형식으로 저장되기 때문에 데이터를 읽어오는 속도가 빠르다.
- 수직 및 수평적 확장이 모두 가능하므로 애플리케이션에서 발생하는 모든 읽기, 쓰기 요청의 처리가 가능하다.
단점
- 유연성 때문에 데이터 구조 결정이 어려울 수 있다.
- 문서 저장이 단위 요소 수준에서 세밀한 보안을 제공하지 않는다.
- NoSQL마다 쿼리 언어를 각기 다르게 사용하는 경우가 많아 이식성이 낮다.
- 데이터베이스의 컬렉션이 다양할 경우, 수정할 때에 모든 컬렉션의 데이터를 수정해야 한다.
📌 관계형 DB가 적합한 경우
- 앱의 여러 부분에서 관련 데이터가 비교적 자주 변경되는 경우 (NoSQL이라면 항상 여러 컬렉션을 수정해야 함)
- 명확한 스키마가 중요하며, 데이터구조가 극적으로 변경되지 않는 경우
📌 비관계형 DB가 적합한 경우
- 정확한 데이터 요구사항을 알 수 없거나 관계를 맺고 있는 데이터가 자주 변경(수정)되는 경우
- 읽기(read)처리를 자주하지만, 데이터를 자주 변경하지 않는 경우 (즉, 한번의 변경으로 수십 개의 문서를 수정 할 필요가 없는 경우)
- 데이터베이스를 수평으로 확장해야 하는 경우 ( 즉, 막대한 양의 데이터를 다뤄야 하는 경우, 읽기/쓰기 처리량이 큰 경우)