
이번에 서비스 구성하면서 DB에 대해서 궁금한 부분이 생겨서, 나중에 찾아보기 위해 정리해보았다.
DB는 데이터를 구조화하고 저장하는 시스템으로, 크게 관계형과 비관계형이 있다.
행과 열을 가지는 표 형식의 데이터베이스를 말한다.
왜 관계형일까? 테이블 자체를 관계(relation)이라고 부르기 때문인데, 테이블의 관계로 구성되어 있기 때문이다. Relation은 수학적 용어로 집합 간의 관계를 말하는데, 여기에서 기인하였다고 한다.
예시)
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| order_id | user_id | item |
|---|---|---|
| 101 | 1 | Book |
| 102 | 1 | Laptop |
| 103 | 2 | Pencil |
이 두 테이블은 orders.user_id는 users.id와 관계(relation)를 맺고 있다.
관계형 데이터베이스는 데이터를 조회하고 추가하고 수정하고 삭제하는 데 SQL을 사용한다. Structured Query Language, 직역하자면 구조화된 질의 언어라는 뜻이다.
1) 정규화(Normalization) 작업을 통한 데이터 중복 최소화
모든 주문 테이블에 동일한 고객의 정보를 계속 저장한다면 불필요한 중복이 일어날 것이다.
| order_id | customer_name | address | item |
|---|---|---|---|
| 101 | Alice | 서울시 강남구 | Book |
| 102 | Alice | 서울시 강남구 | Laptop |
정규화를 하면, 중복되는 고객의 정보를 줄임으로 수정/삭제에 용이하다.
| customer_id | name | address |
|---|---|---|
| 1 | Alice | 서울시 강남구 |
| order_id | customer_id | item |
|---|---|---|
| 101 | 1 | Book |
| 102 | 1 | Laptop |
2) JOIN을 통한 데이터 간 연결
: 서로 다른 테이블의 정보도 하나로 묶어 조회가 가능하다.
3) 정확성(무결성) 보장: 외래 키 제약, 유일성 등
: 잘못된 데이터 저장을 방지하는 다양한 기능이 내장되어 있다.
4) SQL로 강력한 쿼리 가능
: 복잡한 조건, 정렬, 집계, 필터링 등을 표현력 높은 언어(SQL)로 처리 가능하다.
1) 스키마 고정 → 유연성 부족
: 테이블 구조를 미리 정의해야 하기 때문에, 새로운 필드나 구조 변경이 필요하면 DB 구조를 수정해야 하므로 번거롭고 위험할 수 있다.
2) 수평 확장(분산 처리)이 어렵다
: RDB는 한 서버에서 동작하도록 설계되어 있기 때문에, 대규모 트래필, 빅데이터 처리에서는 분산 확장이 힘들고 복잡하다. 반면 NoSQL은 설계상 여러 서버로 자동 분산(scale-out)이 쉽다.
3) 복잡한 JOIN은 성능 저하를 일으킬 수 있음
4) 정규화 → 너무 많은 테이블 분리
: 지나치게 정규화하면, 데이터 조회 시 JOIN이 많아지고 관리가 복잡해진다.
5) 유연한 데이터 구조를 다루기 어려움
: 예를 들어, 같은 테이블에 사용자마다 다른 속성이 필요한 경우 (ex. 자유 양식 설문 응답)
NoSQL(MongoDB 등)은 이런 데이터를 문서 형태로 쉽게 다루지만, RDB에서는 복잡한 테이블 설계가 필요하다.
: Oracle, Mysql, Postgresql, MariaDB 등이 있다.

NoSql은 빅데이터 시대가 도래하면서, 기존 관계형 테이블의 한계를 극복하기 위해 등장하였다. 데이터의 일관성을 포기하는 대신, 여러 대의 컴퓨터에 데이터를 분산하여 저장하는 것을 목표로 한다.
: NoSQL은 "Not Only SQL"의 줄임말로, 전통적인 관계형 데이터베이스(RDBMS)와는 다른 방식으로 데이터를 저장하고 관리하는 데이터베이스를 의미한다.
NoSQL은 SQL을 "사용하지 않는 것"이 아니라, "SQL 만 사용하는 전통 방식에 의존하지 않는다"는 뜻이다.
1) 테이블/행/열 구조가 아닌 다양한 방식으로 데이터 저장
: NoSql은 하나의 통일된 구조만 있는 것이 아니라, 저장 방식이 다양하다.
| 종류 | 설명 | 대표 예시 |
|---|---|---|
| 1. Key-Value형 | 키와 값 쌍으로 저장. 가장 단순하고 빠름. | Redis, DynamoDB |
| 2. 문서형(Document) | JSON 또는 유사 형식의 문서 단위로 저장 | MongoDB, CouchDB |
| 3. 컬럼형(Column-family) | 열 단위로 데이터를 저장, 분석/빅데이터에 적합 | Cassandra, HBase |
| 4. 그래프형(Graph) | 노드와 간선으로 구성된 관계 데이터 표현 | Neo4j, Amazon Neptune |
2) 스키마 자유도 높음 (사전 정의 없이도 필드 추가 가능)
: RDBMS에서는 테이블을 만들 때 컬럼 구조를 미리 정의해야 한다.
그런데 NoSQL은 각 문서마다 필드가 달라도, 이를 강제하지 않기 때문에 유연하게 대처가 가능하다.
// 첫 번째 문서
{ "name": "Alice", "age": 25 }
// 두 번째 문서 (추가 필드 포함)
{ "name": "Bob", "age": 30, "hobby": "golf" }
3) 수평 확장성에 강함 (서버 여러 개로 분산 처리 쉽게 가능)
: RDB는 서버 하나를 더 좋은 사양으로 교체하는 Scale-up 만 가능하다.
하지만 NoSql은 서버를 여러 대로 나누어 분산 처리하는 Scale-out 방식도 가능하다.
그래서 NoSql은 트래픽이 많은 서비스, 빅데이터 환경, 클라우드 기반 앱에 유리하다.
4) 비정형·반정형 데이터에 적합 (JSON, 로그, 센서 데이터 등)
| 데이터 유형 | 설명 | 예시 |
|---|---|---|
| 정형 데이터 | 표처럼 고정된 구조 | 엑셀, SQL 테이블 |
| 반정형 데이터 | 구조는 있으나 유동적 | JSON, XML |
| 비정형 데이터 | 구조 없음 | 로그, 이미지, 동영상, 텍스트 |
RDB는 정형 데이터에 강하지만, NoSql은 유동적인 데이터를 다루기에 더 적합하다.
1) 데이터 무결성 보장이 약함
: MongoDB에서는 두 문서 간의 참조 관계를 강제로 맞추지 않기 때문에 사용자가 직접 데이터 일관성을 관리해야 한다. → 실수나 오류 발생 위험 증가
2) JOIN이 안 되거나 매우 불편함
3) 표준화 부족
: 관계형 DB는 SQL이라는 공통 언어를 사용하는데, NoSQL은 DB마다 쿼리 언어와 구조가 다르다.