1. 정규화란 무엇인가?
정규화(Normalization)는 데이터베이스 설계에서 중복 데이터를 제거하고, 데이터 무결성을 유지하기 위해 데이터를 구조화하는 과정이다.
간단하게 말해, 비효율적으로 설계된 테이블을 더 나은 형태로 쪼개고 관계를 명확히 하는 작업.
이 과정에서 데이터를 여러 테이블로 나누고, 각 테이블이 본질적으로 하나의 주제만을 담당하게 만들어 데이터 중복과 이상 현상을 최소화한다.
정규화의 목적
- 데이터의 중복 최소화
- 데이터의 일관성 유지
- 무결성(Integrity) 보장
- 저장 공간 절약 및 관리 효율화
2. 정규화의 단계별 종류
정규화에는 단계별로 여러 단계가 있다. 기본적으로 다음 4가지가 실무에서 가장 자주 언급된다.
- 제1정규형(1NF)
: 모든 컬럼이 원자값(Atomic Value, 분해가 불가능한 값)만을 가진 상태
: 한 셀에 여러 값(콤마로 구분된 값 등)이 들어가 있으면 1NF 위반 - 제2정규형(2NF)
: 1NF를 만족하면서, 기본키가 아닌 컬럼이 기본키의 일부분에만 종속되는 현상(부분적 종속) 제거
: 즉, 복합키(Composite Key) 테이블에서 기본키 전체에 종속되어야 함 - 제3정규형(3NF)
: 2NF를 만족하면서, 키가 아닌 컬럼 간의 이행적 종속(transitive dependency)이 없는 상태
: 즉, 기본키를 통해서만 다른 컬럼에 접근할 수 있고, 키가 아닌 속성을 통해 다른 속성을 알 수 없어야 함 - BCNF(Boyce-Codd 정규형)
: 3NF를 강화한 형태로, 후보키가 아닌 컬럼이 후보키의 일부에 종속되는 현상까지도 완전히 제거한 형태
3. 데이터 중복과 이상 현상(Anomaly) — 왜 정규화가 필요한가?
데이터 중복
동일한 정보가 여러 테이블, 또는 같은 테이블의 여러 행에 중복 저장되는 현상.
예시) 한 학생이 여러 과목을 수강할 때, 학생 이름이 과목 수 만큼 중복 저장됨.
이상 현상(Anomaly)
정규화가 안된(비정규화된) 테이블에서 발생하는 데이터 무결성 문제. 대표적으로 3가지가 있음.
- 삽입 이상(Insertion Anomaly)
: 일부 정보만으로는 데이터를 추가할 수 없음
: 예) 수강생이 없는 강의 정보는 추가 불가 - 수정 이상(Update Anomaly)
: 중복 데이터가 여러 곳에 있어서, 일괄 수정이 필요
: 예) 교수 이름이 여러 레코드에 걸쳐있을 때, 모두 수정하지 않으면 데이터 불일치 발생 - 삭제 이상(Deletion Anomaly)
: 한 행을 삭제하면 원치 않는 다른 정보도 같이 삭제
: 예) 학생이 한 명도 수강하지 않게 되면, 강의 자체의 정보까지 삭제됨
4. 비정규화 테이블에서 이상 현상 실전 예시
아래처럼 학생과 강의, 교수 정보를 한 테이블에 몰아넣으면 문제 발생.
create table if not exists student_course (
student_id int not null,
student_name varchar(50) not null,
course_id int not null,
course_name varchar(50) not null,
professor_name varchar(50) not null,
primary key (student_id, course_id)
);
| 1 | 문창배 | 101 | 챗봇 | bergerac |
| 1 | 문창배 | 102 | 챗GPT | 김준일 |
| 2 | 진우태 | 102 | 챗GPT | 김준일 |
| 3 | 조민지 | 104 | 디지털트윈 | 안근수 |
삽입 이상
- 학생 없이 강의만 등록 불가
(student_id가 반드시 있어야 insert 가능)
수정 이상
- 같은 교수 이름을 여러 행에서 수정해야 함
(ex: '김준일' → '김준이'로 변경하면 모든 해당 행을 일일이 수정)
삭제 이상
- 특정 학생의 데이터를 삭제하면, 해당 학생이 유일하게 수강했던 강의의 정보까지 사라짐
5. 정규화 적용 예시
정규화를 통해 아래처럼 테이블을 분리
1) 학생 테이블
create table student (
student_id int primary key,
student_name varchar(50)
);
2) 강의 테이블
create table course (
course_id int primary key,
course_name varchar(50),
professor_name varchar(50)
);
3) 학생-강의 관계(중간 매핑 테이블)
create table student_course_connect (
student_id int,
course_id int,
primary key (student_id, course_id),
foreign key (student_id) references student(student_id),
foreign key (course_id) references course(course_id)
);
6. 정규화의 실제 효과
- 데이터 중복 제거
: 학생 이름, 교수 이름, 강의명이 여러 번 반복 저장되지 않음 - 삽입 이상 해소
: 수강생 없는 강의도 단독 등록 가능 (학생 테이블, 강의 테이블 따로 존재) - 수정 이상 해소
: 교수 이름 변경시 한 번만 수정하면 됨 (course 테이블만 수정) - 삭제 이상 해소
: 학생이 수강을 취소해도, 강의 자체 정보는 유지 (연결 테이블만 삭제)
7. 정규화 설계 실전 쿼리
테이블 생성 및 데이터 입력
-- 학생
insert into student values
(1, '양현석'),
(2, '성재원'),
(3, '최서윤');
insert into course values
(101, '챗봇', '이승아'),
(102, '챗GPT', '김준일'),
(103, '코리아IT', '조승범');
-- 학생-강의 관계
insert into student_course_connect values
(1, 101),
(1, 102),
(2, 101),
(3, 103);
-- 강의만 단독 등록도 가능
insert into course values
(104, '디지털트윈', '안근수');
정보 갱신/삭제도 간단
-- 교수명 수정 (김준일 → 김준삼)
update course set professor_name = '김준삼' where professor_name = '김준일';
-- 수강정보만 삭제 (학생, 강의 정보에는 영향 X)
delete from student_course_connect where student_id = 3;
8. 정규화의 핵심 정리
- 1NF : 각 칼럼이 오직 하나의 값만을 가진다.
- 2NF : 1NF + 기본키의 일부가 아닌 컬럼은 기본키 전체에 의존한다.
- 3NF : 2NF + 키가 아닌 컬럼이 서로를 결정하지 않는다.
- BCNF : 3NF를 만족하면서, 모든 결정자가 후보키다.
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| 정규화 - [제 2 정규형(2NF)] (0) | 2025.06.29 |
|---|---|
| 정규화 - [제 1 정규형 (1NF)] (1) | 2025.06.28 |
| ERD Diagram (0) | 2025.06.26 |
| Trigger - 자동화 (0) | 2025.06.25 |
| MySQL(Trigger) (1) | 2025.06.24 |