데이터베이스 설계의 핵심은 데이터를 효율적으로 관리하고, 무결성을 유지하며, 중복을 최소화하는 것이다. 이를 위해 사용하는 방법이 정규화(Normalization)이다.
데이터베이스 정규화
정규화는 관계형 데이터베이스를 설계할 때 중복 데이터를 줄이고, 데이터 무결성을 유지하며, 효율적인 데이터 관리를 목표로 데이터를 구조화하는 과정이다.
데이터베이스 이상의 개념과 종류
데이터베이스 설계가 적절하지 않을 경우, 삽입 이상, 삭제 이상, 갱신 이상과 같은 문제(이상)가 발생할 수 있다.
삽입 이상 (Insertion Anomaly)
새로운 데이터를 삽입할 때 불필요한 정보를 함께 저장해야 하는 문제다.
| 학생ID | 이름 | 학과명 | 학과장 |
|---|---|---|---|
| 1 | 홍길동 | 컴퓨터학과 | 김교수 |
문제점: 새로운 학과(예: 전기공학과)를 추가하려면, 학과장이 없는 상태에서도 ‘학생ID’와 ‘이름’ 데이터를 함께 입력해야 한다.
삭제 이상 (Deletion Anomaly)
데이터를 삭제할 때 의도치 않게 다른 중요한 정보도 삭제되는 문제다.
| 학생ID | 이름 | 학과명 | 학과장 |
|---|---|---|---|
| 1 | 홍길동 | 컴퓨터학과 | 김교수 |
문제점: ‘홍길동’의 데이터를 삭제하면, 컴퓨터학과의 학과장 정보도 함께 사라진다.
갱신 이상 (Update Anomaly)
중복된 데이터 중 일부만 수정되어 데이터 불일치가 발생하는 문제다.
| 학생ID | 이름 | 학과명 | 학과장 |
|---|---|---|---|
| 1 | 홍길동 | 컴퓨터학과 | 김교수 |
| 2 | 김영희 | 컴퓨터학과 | 김교수 |
문제점: 학과장이 변경되었을 때(예: 이교수), 일부 데이터만 갱신하면 불일치가 발생한다.
정규화 단계
정규화는 데이터를 구조화하기 위한 여러 단계로 이루어져 있으며, 단계가 높아질수록 데이터 중복과 이상이 감소한다.
제1정규형 (1NF)
제1차 정규화는 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 해당 컬럼을 제거하고 기본테이블의 PK를 추가해 새로운 테이블을 생성하고, 기존의 테이블과 1:N 관계를 형성하는 것이다
변환 전:
| 주문ID | 고객명 | 연락처 | 상품명 |
|---|---|---|---|
| 1 | 홍길동 | 010-1234-5678 | 사과, 바나나 |
| 2 | 김영희 | 010-5678-1234 | 딸기, 포도, 배 |
변환 후:
| 주문ID | 고객명 | 연락처 | 상품명 |
|---|---|---|---|
| 1 | 홍길동 | 010-1234-5678 | 사과 |
| 1 | 홍길동 | 010-1234-5678 | 바나나 |
| 2 | 김영희 | 010-5678-1234 | 딸기 |
| 2 | 김영희 | 010-5678-1234 | 포도 |
| 2 | 김영희 | 010-5678-1234 | 배 |
제2정규형 (2NF)
제2정규화는 PK가 여러 키로 구성된 복합키(Composite Primary Key)로 구성된 경우가 2차 정규화의 대상이 되며, 복합키 전체에 의존하지 않고 복합키의 일부분에만 종속되는 속성들이 존재할 경우 (즉, 부분적 함수 종속 관계) 이를 분리하는 것이다.
변환 전:
| 주문ID | 상품ID | 상품명 | 고객명 |
|---|---|---|---|
| 1 | 101 | 사과 | 홍길동 |
| 1 | 102 | 바나나 | 홍길동 |
| 2 | 103 | 딸기 | 김영희 |
| 2 | 104 | 포도 | 김영희 |
변환 후:
| 주문ID | 고객명 |
|---|---|
| 1 | 홍길동 |
| 2 | 김영희 |
| 상품ID | 상품명 |
|---|---|
| 101 | 사과 |
| 102 | 바나나 |
| 103 | 딸기 |
| 104 | 포도 |
제3정규형 (3NF)
테이블의 키가 아닌 컬럼들은 기본키에 의존해야 하는데 겉으로는 그런 것처럼 보이지만 실제로는 기본키가 아닌 다른 일반 컬럼에 의존하는 컬럼들이 있을 수 있다. 이를 (이전적 함수 종속 관계)라고 한다. 제 3정규화는 PK에 의존하지 않고 일반컬럼에 의존하는 컬럼들을 분리한다.
변환 전:
| 학생ID | 이름 | 학과ID | 학과명 |
|---|---|---|---|
| 1 | 홍길동 | 101 | 컴퓨터학과 |
| 2 | 김영희 | 102 | 기계공학과 |
변환 후:
| 학생ID | 이름 | 학과ID |
|---|---|---|
| 1 | 홍길동 | 101 |
| 2 | 김영희 | 102 |
| 학과ID | 학과명 |
|---|---|
| 101 | 컴퓨터학과 |
| 102 | 기계공학과 |
BCNF (Boyce-Codd Normal Form)
조건: 제3정규형을 만족하며, 모든 결정자가 후보 키여야 한다.
반정규화
반정규화는 정규화로 나눠진 테이블들을 성능상의 이유로 다시 합치는 작업이다. 정규화로 인해 테이블들이 여러개로 쪼개져서 join이 많이 발생한다면 성능 이슈가 발생한다. 이런 경우에는 정규화에는 위배되지만 성능 향상을 위해 테이블을 합치는 방법을 선택할 수 있다. 그렇다고 정규화를 한다고 해서 반드시 성능을 떨어뜨리는 것이 아니기 때문에 일반화 하지는 말자.