데이터베이스의 종류는 관계형 데이터베이스와 비관계형 데이터베이스로 나뉜다.
관계형 데이터베이스
테이블의 구조와 데이터 타입 등을 사전에 정의하고, 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있다.
그렇다면 이러한 데이터베이스는 언제 사용할까?
데이터의 무결성과 일관성이 가장 중요한 경우 (ACID 필수)
- 트랜잭션의 Atomicity와 Consistency가 필수적인 시스템의 경우(금융 및 결제 시스템)
- 한정된 자원을 여러 사용자가 동시에 접근해서 처리해야할 경우(재고 관리 및 예약 시스템)
데이터가 명확한 구조적 관계를 가지고 있는 경우
- 관계형 데이터 모델링의 경우로 데이터 간의 관계(1:1, 1:N 등)가 복잡하게 얽혀 있고, 조인(JOIN) 연산을 통해 데이터를 조합하여 조회해야 하는 경우일 때
- 정형화된 데이터의 경우로 데이터의 스키마가 명확하고 변경이 자주 발생하지 않는 경우일 때
시스템의 규모가 단일 서버나 소규모/중규모 클러스터 수준인 경우
NoSQL의 장점인 수평적 확장이 필수적이지 않은 환경일 때를 말한다.
구조

이러한 테이블은 Row과 Column(열)로 구성되어 있으며 각 Column(열)은 하나의 속성에 대한 정보를 저장하고 Row에는 속성에 맞는 데이터가 저장될 수 있다. 그리고 하나의 열이 가질 수 있는 원자값들의 집합들을 Domain이라고 한다.
관계형 데이터베이스는 특정한 형식을 지킨다는 특징이 있어 데이터를 정확히 입력하지 않는다면 쉽게 접근할 수 없다.
이러한 DB를 다루는 언어 또한 존재한다. 바로 SQL 인데 표준 SQL을 배우면 대부분의 DBMS에 공통적으로 적용이 가능하다.
Key
- 슈퍼키 (Super Key): 릴레이션 내의 튜플들을 고유하게 식별할 수 있는 속성들의 집합 (유일성 만족).
- 후보키 (Candidate Key): 튜플을 유일하게 식별할 수 있는 최소한의 속성 집합 (유일성 + 최소성 만족).
- 기본키 (Primary Key, PK): 후보키 중에서 선택된, 테이블을 대표하는 주 키. NULL 값을 가질 수 없으며, 중복될 수 없음.
- 대체키 (Alternate Key): 후보키 중에서 기본키를 제외한 나머지 키.
- 외래키 (Foreign Key, FK): 테이블 간의 참조 관계를 정의하는 키. 다른 테이블의 기본키를 참조하여 데이터의 무결성을 유지
등이 있다. 예시와 함께 보도록 하자.
| 학번 (Student_ID) | 주민등록번호 (SSN) | 이름 (Name) | 학과 (Department) | 전화번호 (Phone) |
| 20260001 | 980101-1234567 | 김코딩 | 컴퓨터공학 | 010-1234-5678 |
| 20260002 | 990505-2345678 | 이데이터 | 데이터사이언스 | 010-9876-5432 |
| 20260003 | 001212-1122334 | 박시스템 | 컴퓨터공학 | 010-1111-2222 |
슈퍼키는 위에서 말했듯이 고유하게 식별만 하면 된다. 학번, 주민등록번호 , (학번, 이름), (학번, 주민등록번호) 등이 있다.
후보키는 위 슈퍼키에서 제일 최소한의 속성으로 식별할 수 있는 키를 말한다. 위에서는 학번과 주민등록번호가 있겠다.
기본키는 테이블을 대표하기 위해 후보키 중 선택된 주 키이다. 중복될 수 없고 NULL값을 가질 수도 없다. 여기서는 학번을 기본키로 해보자.
대체키는 후보키 중에 기본키로 선택되지 않은 나머지 키들을 말한다. 그렇다면 주민등록번호가 대체키가 된다.
외래키는 저 기본키를 다른 테이블에서 가져다 쓸 때의 기본키를 말한다.
| 수강번호 | 학번 (FK) | 과목명 |
| 101 | 20260001 | 운영체제 |
| 102 | 20260001 | 데이터베이스 |
| 103 | 20260002 | 알고리즘 |
대응 cardinality

1 : 1 관계
A 테이블의 데이터 1개가 B 테이블의 데이터 1개와 정확히 대응하는 관계를 말한다.
예를 들어 한 사람당 1개의 주민등록번호를 가질 수 있고 1개의 주민등록번호는 1명의 사람에게만 속하는 것을 의미
1 : N 관계
가장 흔하게 사용되는 관계로, A 테이블의 데이터 1개가 B 테이블의 데이터 여러 개와 대응할 수 있는 관계를 말한다.
예를 들어 한 사람의 수강 바구니에 여러 수강 과목이 들어갈 수 있는 것처럼
M : N 관계
A 테이블의 데이터 여러 개가 B 테이블의 데이터 여러 개와 대응할 수 있는 관계이다.
예를 들어 1명의 학생은 여러 과목을 수강할 수 있고 반대로 1개의 과목에는 여러 명의 학생이 수강할 수 있는 것처럼
문제는 관계형 데이터베이스는 구조상 M : N 관계를 가지기 힘들다는 것이다. 그래서 Mapping Table을 두어 1:N관계로 풀어내는 방식을 사용한다.
정규화
한마디로 데이터 중복을 최소화하고 데이터 무결성을 보장하기 위해 데이터 베이스를 설계하는 현상을 말함!
- 물론 과도한 정규화는 조인의 횟수가 많아져 성능이 감소할 지도 모른다.
⇒ 그래서 과도한 정규화를 했을 때 역정규화(반정규화)가 필요하다.
- 데이터 중복을 일부 허용하여 조인을 줄여 성능을 높일 수 있다.
- 그래서 정규화와 역정규화를 적절히 사용하여 성능과 무결성 사이의 거리를 잘 잡아야함
예시를 보도록 하자.
| 학생ID | 학생이름 | 학과 | 수강과목_정보 |
|--------|----------|------------|---------------------------------------------------|
| 1001 | 홍길동 | 컴퓨터공학 | 'C101:자료구조(이교수)', 'C102:알고리즘(박교수)' |
| 1002 | 김철수 | 소프트웨어 | 'C101:자료구조(이교수)' |
제 1정규화
“한 칸엔 하나의 데이터만”
| 학생ID | 학생이름 | 학과 | 과목ID | 과목명 | 담당교수 |
|--------|----------|------------|--------|----------|----------|
| 1001 | 홍길동 | 컴퓨터공학 | C101 | 자료구조 | 이교수 |
| 1001 | 홍길동 | 컴퓨터공학 | C102 | 알고리즘 | 박교수 |
| 1002 | 김철수 | 소프트웨어 | C101 | 자료구조 | 이교수 |
제 2정규화
“partial dependency를 제거”
→ partial dependency : composite pk에 종속된 col을 말함
- 위 1NF 테이블의 기본 키(PK)는 학생과 과목을 유일하게 식별하는 (학생ID, 과목ID) 조합이라고 하자 (Composite PK)
- partial dependency 발생:
- 학생이름, 학과는 PK의 일부인 학생ID에만 종속됩니다.
- 과목명, 담당교수는 PK의 일부인 과목ID에만 종속됩니다.
| 학생ID (PK) | 학생이름 | 학과 |
|-------------|----------|------------|
| 1001 | 홍길동 | 컴퓨터공학 |
| 1002 | 김철수 | 소프트웨어 |
| 과목ID (PK) | 과목명 | 담당교수 |
|-------------|----------|----------|
| C101 | 자료구조 | 이교수 |
| C102 | 알고리즘 | 박교수 |
제 3정규화
“일반 컬럼에만 종속된 컬럼은 다른 테이블로 빼기” 라고 하는데 더 설명하자면 기본키가 아닌 일반 컬럼이 다른 일반 컬럼에 종속되는 현상을 제거하여 테이블을 분리하는 것이다. 위의 예시에서 과목 테이블에 교수연구실 정보가 추가된다고 가정해 보자.
| 과목ID (PK) | 과목명 | 담당교수 | 교수연구실 |
|-------------|----------|----------|--------------|
| C101 | 자료구조 | 이교수 | 공학관 301호 |
| C102 | 알고리즘 | 박교수 | 공학관 405호 |
| C103 | 운영체제 | 이교수 | 공학관 301호 |
이때 교수연구실은 과목ID가 아닌 담당교수에 종속된다. 이를 분리하는 것이 바로 제 3정규화이다.
| 과목ID (PK) | 과목명 | 담당교수(FK)
|-------------|----------|----------
| C101 | 자료구조 | 이교수
| C102 | 알고리즘 | 박교수
| C103 | 운영체제 | 이교수
| 담당교수 (PK) | 교수연구실 |
|---------------|--------------|
| 이교수 | 공학관 301호 |
| 박교수 | 공학관 405호 |
'Study > DataBase' 카테고리의 다른 글
| [DB/공부일지] NoSQL (0) | 2026.05.04 |
|---|---|
| [DB/공부일지] DB와 DBMS의 차이 (0) | 2026.05.04 |
| [DB/공부일지] File Processing System (0) | 2026.05.04 |