유튜브 채널 코딩애플의 데이터 정규화 영상, 나무위키 참조함


SQL의 정규화는 데이터의 일관성, 최소한의 데이터 중복, 최소한의 데이터 유연성을 위해 사용되며 데이터를 분해하는 과정이다. 주로 관계형 데이터베이스에서만 사용되며 3정규화(3NF) 이상은 하지 않는 편.

정규화의 장점 (예시는 글 맨아래)

  1. 중복데이터 제거
  2. 무결성 유지
  3. 이상현상 방지 - 삽입이상, 삭제 이상, 갱신 이상
  4. 데이터의 안정적인 구조로 유지보수가 쉬워짐

제1 정규형

직원 A씨가 체육센터 수강 등록 현황을 정리한다고 하자.

회원번호 회원이름 프로그램
101 강호동 스쿼시
102 손흥민 헬스
103 김민수 헬스

그런데 김민수씨가 골프 초급 프로그램에도 등록한다면 어떻게 해야할까?

회원번호 회원이름 프로그램
101 강호동 스쿼시
102 손흥민 헬스
103 김민수 헬스 골프초급

이렇게 한 칸에 두개를 적을 수도 있겠지만 이러면 골프초급을 수강한 사람을 찾기 힘들어진다. 프로그램 이름 수정도 어려워진다.

회원번호 회원이름 프로그램
101 강호동 스쿼시
102 손흥민 헬스
103 김민수 헬스
103 김민수 골프초급

그래서 이렇게 한 칸에는 하나의 데이터만 저장하는걸 제1 정규화 라고하고, 이런 테이블을 제1 정규형 테이블 이라고 한다.

제2 정규형

이번엔 프로그램의 가격을 추가했다고 하자.

회원번호 회원이름 프로그램 가격 납부여부
101 강호동 스쿼시 5000 0
102 손흥민 헬스 6000 1
103 김민수 헬스 6000 1
103 김민수 골프초급 8000 0

그런데 이러면 헬스의 가격을 수정하려면 여러 행의 가격을 수정해줘야 하는 문제가 있다.

가격은 사실 현재 테이블 주제인 수강 등록 현황 과 별 상관이 없다. 그래서 아예 따로 빼준다.

회원번호 회원이름 프로그램 납부여부
101 강호동 스쿼시 0
102 손흥민 헬스 1
103 김민수 헬스 1
103 김민수 골프초급 0

 

프로그램 가격
스쿼시 5000
헬스 6000
골프초급 8000

이렇게 두가지 테이블로 관리하면 헬스 가격을 수정해도 1개 항목만 수정하면 된다.

이 과정을 제2 정규화 라고하고, 이런 테이블을 제2 정규형 테이블 이라고 한다.

제2 정규형의 정확한 정의는

partial dependency를 제거한 테이블이다.

partial dependency는 무엇인가?

primary key는 행을 구분하기 위해 만든 컬럼 이다.(user_id같은거) 하지만 위의 표는 primary key 역할의 컬럼이 없다. (회원번호, 이름은 중복있음) 하지만 회원번호와 프로그램을 합치면 각 행마다 유니크하니 primary key 역할을 하게 할 수 있다.  이 두개의 컬럼들을 composite primary key 라고 한다. 이 composite primary key 중 하나에만 종속된 컬럼을 partial dependency가 있다고 말하고 위 표에서는 가격이 그렇다. 그런 컬럼을 다른 테이블로 떼버리는걸 제 2 정규화라 한다.

제3 정규형

아래 표는 primary key는 있지만 composite primary key는 없는 제2 정규형 테이블이다.

프로그램 가격 강사 출신대학
스쿼시 5000 김을용 서울대
헬스 6000 박덕팔 연세대
골프초급 8000 이상구 고려대
골프중급 9000 이상구 고려대
개인피티 6000 박덕팔 연세대

그런데 출신대학은 강사에 종속적이다. 여기서도 마찬가지로 이상구의 출신대학을 바꾸려면 여러 항목을 수정해야 하는 문제가 있다.

프로그램 가격 강사
스쿼시 5000 김을용
헬스 6000 박덕팔
골프초급 8000 이상구
골프중급 9000 이상구
개인피티 6000 박덕팔

 

강사 출신대학
김을용 서울대
박덕팔 연세대
이상구 고려대

이런 식으로 일반 컬럼에만 종속된 컬럼을 다른 테이블로 빼는걸 제3 정규화라고 하고 그런 테이블을 제3 정규형 테이블 이라 한다.

정규화의  장점

  1. 중복데이터 제거
  2. 무결성 유지
    여러개 항목을 변경하다 실수로 몇개 놓쳐서 데이터 불일치가 발생하는 경우 없어짐
  3. 이상현상 방지 - 삽입이상
    1 정규형의 예시를 보면 가입한 회원이 없는 요가 프로그램을 추가할 수 있을까? 블가능하다.
    정규화 이후에는 회원 테이블에는 추가되지 않지만 프로그램 테이블에는 추가할 수 있다.
  4. 이상현상 방지 - 삭제 이상
    위 제2 정규형 단락의 첫번째 표에서(제1 정규형 표)강호동이 수강취소를 하면 스쿼시 프로그램 정보도 삭제된다.
    위 제3 정규형 단락의 첫번째 표에서(제2 정규형 표) 골프초급, 중급이 폐강되면 이상구의 출신대학 정보도 삭제된다.
  5. 이상현상 방지 - 갱신 이상
    하나의 변경사항 때문에 여러 항목을 수정해야 할 필요가 없어진다
  6. 데이터의 안정적인 구조로 유지보수가 쉬워짐

정규화의 단점

  1. 테이블을 여러개로 쪼개니까 조회할때 JOIN이 많아짐
  2. 성능저하 가능성
    join이 많으면 cpu사용 증가, 인덱스 사용 안하면 느림
  3. 개발 복잡도 증가

 

'공부 > DB' 카테고리의 다른 글

postgreSQL INDEX  (0) 2026.02.15
postgreSQL JOIN  (0) 2026.02.15
DBeaver 사용하기  (0) 2026.02.13
postgres 서버에 c 연결해서 쓰기 w.Mac  (0) 2026.02.12
SQL CRUD  (0) 2025.09.04

+ Recent posts