웹개발/SQL(mySQL)

정규화

bergerac 2025. 6. 27. 09:11

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. 정규화의 핵심 정리

  1. 1NF : 각 칼럼이 오직 하나의 값만을 가진다.
  2. 2NF : 1NF + 기본키의 일부가 아닌 컬럼은 기본키 전체에 의존한다.
  3. 3NF : 2NF + 키가 아닌 컬럼이 서로를 결정하지 않는다.
  4. 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