※이글의 예시들은 Udemy의 Angela Yu의 "The-Complete-Web-Development-Bootcamp" 강의의 내용을 정리한 것입니다.
세상에는 수많은 데이터베이스가 있고, 우리는 다룰 데이터의 종류나 구조에 따라 그 중 한가지를 골라 사용하게 된다. 이런 수많은 데이터베이스들은 크게 두 부류로 나뉘게 된다. 첫번째는 SQL, 다른 한가지는 NoSQL이다.
SQL? NoSQL?
SQL은 Structured Query Language의 약자로 업계에서 수년동안 이용되어 왔다. 대표적으로 MySQL, PostgreSQL이 있다.
NoSQL은 Not Only Structured Query Language의 약자로 SQL이 아니라면 어떤 포맷이든 될 수 있지만, 대부분 비슷한 포맷을 가지고 있다. 대표적으로 MongoDB와 Redis가 있다.
차이점
1. 구조
성 | 이름 | 주소 |
홍 | 길동 | 서울시 영등포구 |
박 | 순동 | 전라북도 전주 |
고객의 정보를 담은 테이블을 만드려고 할 때, SQL을 이용하면 위와 같이 쉽게 저장할 수 있다. 하지만, 유연하게 대처하지 못하는 상황이 올 수도 있다.
성 | 이름 | 주소 | 이메일 |
홍 | 길동 | 서울시 영등포구 | NULL |
박 | 순동 | 전라북도 전주 | psd@he.kr |
김 | 순자 | NULL | NULL |
만일 "박순동"이라는 고객이 우편이 아닌 이메일을 이용해서 수신하겠다며 이메일 주소를 알려줬을 경우를 생각해보자. 그때, 이메일 주소는 어디에도 들어맞지 않는다. 혹은 새로운 고객 "김순자"가 주소를 알리길 원치 않을 때, 주소란이 비어있게 되고 모든 비어있는 부분은 NULL이 되며 이는 처리시 문제가 될 수 있다.
하지만, 우리가 MongoDB와 같은 NoSQL기반의 데이터베이스를 사용하면, 이는 문제가 되지 않는다. 그저 JSON 형태로 데이터를 저장하면 된다.
{
성:"홍",
이름:"길동",
주소:"서울시 영등포구"
}
{
성:"박",
이름:"순동",
주소:"전라북도 전주",
이메일:"psd@he.kr"
}
{
성:"김",
이름:"순자"
}
NoSQL은 유연하며 새롭고 현대적인 느낌이라면, SQL은 오래되고 믿음직하며 구조를 좋아한다.
2. 관계
SQL은 관계형 데이터베이스, NoSQL은 비관계형 데이터베이스이다. SQL은 데이터 간 관계를 구축하는 데 좋다.
성 | 이름 | 주소 | 상품명 | 수량 | 가격 |
박 | 순동 | 전주 | 연필 | 12 | 800 |
박 | 순동 | 전주 | 펜 | 15 | 1500 |
이러한 표가 있을 때 한눈에 고객 정보를 파악하기 쉽다. 하지만 만일 똑같은 고객이 두번 방문했을 경우에 반복되는 부분이 있고, 이는 비경제적이다.
SQL을 사용하여 관계있는 데이터들을 개별로 그룹화 할 수 있다. 주문 테이블을 고객ID를 통해 고객 테이블과, 상품ID를 통해 상품 테이블과 연결할 수 있다.
NoSQL을 사용할 때는 어떻게 데이터들을 조직할 지 다시 생각해봐야 한다.
//주문 객체
{
주문ID: 주문_1,
고객: 사람_1,
상품: 상품_1,
주문수량: 12
{
//고객 객체
{
고객ID: 사람_1,
성: "홍",
이름: "길동",
주소: "서울시 영등포구"
}
//상품 객체
{
상품ID: 상품_1,
상품명: "연필",
상품가격: 800
}
이렇게 정리된 데이터들은 SQL과 달리 눈에 잘 들어오지 않고, 비효율적이다.
둘 중 뭐가 더 좋다라는 개념은 없다. 다만 필요한 상황에 따라 알맞은 데이터베이스를 사용하면 된다.
고객 정보와 구매 내역 같은 데이터 상호 간 관계가 깊은 상황에서는 SQL을 사용하는 것이 알맞고, 1 대 N의 관계를 가진 데이터들을 조작해야 할 때는 NoSQL을 사용하는 것이 더 정리하기 편할 것이다.
3. 확장성
SQL은 데이터를 위로 쌓아서 확장하는 것과 같고, NoSQL은 서로 다른 컴퓨터에 가로로 확장하는 것과 같다. 그래서 SQL을 사용할 때 행이 셀 수 없이 늘어난다면, 처리 속도는 한없이 느려지고 탑이 무너지듯이 다운될 수 있다 하지만, NoSQL을 사용하면 서로 다른 컴퓨터에 데이터베이스가 분산되는 것과 같아 처리 속도가 빠르다.
비교 정리 |
mySQL | MongoDB |
더 성숙함 | 새로움 |
테이블 구조 | 도큐먼트 구조 |
스키마를 필요로 함 (생성 전에 구조를 생각해놔야 함) | 변화에 유연하다 |
관계 깊은 데이터베이스에 좋음 | 단순한 관계는 괜찮지만 복잡한 건 다루기 어려움 |
쌓아서 확장하는 것과 같아서 느려짐 | 분산하여 쌓기 때문에 처리 속도가 빠름 |
'강의노트' 카테고리의 다른 글
[mongoDB] mongoDB에서 관계성 정립 (0) | 2020.01.03 |
---|---|
[mongoDB] mongo db의 CRUD (0) | 2020.01.03 |
[SQL] 데이터베이스 조작 (0) | 2020.01.02 |
[express] params를 이용한 라우팅(routing) (0) | 2019.12.24 |
버블 정렬(bubble sort) (0) | 2019.12.22 |