🗂DB종류 (관계형, NoSQL)
1️⃣ 관계형(Relational) 데이터베이스
정의
- 엑셀처럼 행과 열로 데이터를 저장할 수 있는 데이터베이스
- 엑셀시트처럼 생긴 테이블이라는 표(?)에 행,열 맞춰 데이터를 쭈--욱 저장한다
특징
- 범용적 : 거의 모든 곳에 사용 가능
- 구조화된 데이터 저장하기에 좋음
- 보통 SQL언어를 이용해서 데이터 출력 입력함
- '이 열엔 숫자가 들어온다' ->이런식으로 스키마를 미리 정의함 , 때문에 관리가 쉬움
- 구조화되어있기 때문에 데이터 뽑기 쉬움
- 트랜잭션 롤백같은 기능을 이용해 데이터의 무결성을 보존하기 쉽기 때문에 금융, 거래 서비스에 필수
relational?
- 데이터들끼리 서로 관계를 정해서 데이터를 저장할 수 있다는 의미임
- 담당하는 일이 1개 인 경우에는 "홍길동 : 프론트엔드개발"이렇게 정의할 수 있으나 한사람이 여러개 업무를 할 경우에는 1:1매칭이 어려울 수 있음
때문에 여러개 데이터를 매칭 시킬 수 있는 테이블을 1개 더 만들어서 표현
- one to one, one to many, many to many 다양한 종류가 있음
2️⃣ NoSQL(객체형태로 따로따로 저장)
정의
- 용어 자체는 범용적으로 SQL문 없이도 사용할 수 있는 데이터베이스라고 생각할 수 있음
- 대부분 테이블에 국한되지 않고 자유로운 형식으로 데이터를 쉽게 분산저장할 수 있음
- Key-value 모델 : Object, JSON 자료형 형식으로 데이터를 쉽게쉽게 저장, 출력이 가능(가장 심플)
- Document 모델 : 테이블 대신 Collection이라는 문서 기반으로 데이터 분류, 저장
- Graph 모델 : 데이터를 노드의 형태로 저장하고 노드간의 흐름 or 관계를 저장할 수 있음
- Wide-column 모델 : 한 행마다 각각 다른 수, 다른 종류의 열을 가질 수 있음 (스키마가 자유로움)
=> ✏️ 참고) mongoDB : Key-value, Document 모델 저장방식을 가지고 있음
특징
-
Scaling이 쉬움
: 데이터를 순간적으로 빨리 저장할 때 관계형 데이터는 확장에 어려움이 있다보니
scale up을 통해 서버의 성능을 키워서 저장해야함
그러나 NoSQL은 scale out으로 데이터를 분산저장할 수 있어
대량의 데이터의 빠른입출력이 하고 싶다? NoSQL이 적합함
-
다루기 쉬움
: 자바스크립트의 object{}다루는 것과 거의 유사하여 기존 쓰고있던 자바스크립트에서 바로 사용 가능
-
대부분 스키마 정의 없이 쉽게 쓸 수 있음 (ex. 이 열에 들어가는 데이터 = 숫자라고 표기안해도됨)
: 장점이자 단점이 될 수 있다보니 MongoDB에선 스키마를 미리 정의하기 위해 Mongoose라이브러리를 추가해서 사용하기도 함
-
SQL에서의 JSON연산을 적용하는게 기본적으로 어려움
: 서버단에서 JOIN연산을 쉽게 처리해주는 라이브러리 이용
결론 : 두가지 데이터 장단점에 따라 사용하자
금융서비스, 은행 전산시스템 정규화된 데이터, 안정성 ? "관계형 데이터베이스"
수백만개의 데이터 입출력 요청의 SNS 서비스, 변경이 자주 일어나는 경우 NoSQL
TMI : 블록체인?
전세계 모든 사람이 거래내역을 저장하고 관리해줄 수 있는 방법이라고 생각할 수 있음
관리해주는 대가로 비트코인을 지급받을 수 있음
A가 B에게 1코인을 지급하는 형태로 장부에 기록되어있으나 A,B의 정보는 암호화되어있음
-> 거래내역의 투명성, 익명성, 공정성 보장
-> 그러나 처리시간, 스케일링, 수수료 문제 등과 같은 이유로 실용화되고 있지는 못하는 상황