개발/sqld

[SQL/1과목] 정규화란?

2ivii 2025. 8. 11. 15:42

정규화에 대해 알아보겠다 ! 우선 이 부분은 개인적으로 어려웠던 부분이기에, 잘 정리해보겠다..!!

 


정규화란?

 

정규화(Normalization)는 데이터를 구조화해서 중복을 줄이고, 데이터 무결성을 유지하며, 효율적으로 관리할 수 있도록 하는 과정이다. 주로 데이터베이스 설계에서 쓰이는 개념이다. 

 

정규형이란?

 

정규화를 적용한 그 결과로 얻어진 구조의 상태이다.

 

정규화를 왜 할까?

 

데이터 중복이 일어나면 일관되지 않은 데이터, 비정상적인 삽입 갱신 삭제 처리, 디스크 공간 낭비 등 많은 문제가 발생하고 삽입·수정·삭제 시 발생할 수 있는 이상 현상을 방지하기 위해서 정규화를 한다.

 

하지만 정규화를 한다해서 무조건적으로 좋은 것은 아니다!

 

데이터를 분리하기 때문에 JOIN이 많아져서 조회 속도가 느려질 수 있다. 그렇기에 아래처럼 하는 것이 좋다.

 

  • 업데이트·무결성이 중요한 경우 → 정규화 중심
  • 조회·분석 성능이 중요한 경우 → 반정규화(De-normalization) 병행

정규화는 절대 규칙이 아니기에 성능과 유지보수성 사이에서 균형을 맞추는 것이 중요하다.

 

이런 정규화에 단계가 있는데,  1-6단계까지 있지만 실제론 3단계까지만 알아도 무방하다곤한다.

 


제 1차 정규화 (1NF)

 

제 1차 정규화는, 모든 속성이 반드시 하나의 값을 가지게 하는 것이다. 예시와 함께 보겠다.

 

아래의 표는 제 1차 정규화가 아직 적용되지 않은 데이터베이스이다. 현재는 , 강좌명 속성이 여러 값을 가지고있다.

학번 학생이름 강좌명
1 철수 데이터베이스기초, 운영체제
2 영희 운영체제
3 민수 컴퓨터 네트워크

 

이것을 제 1차 정규화를 적용한다면, 아래와 같이 된다.

학번 학생이름 강좌명
1 철수 데이터베이스기초
1 철수 운영체제
2 영희 운영체제
3 민수 컴퓨터 네트워크

 

이처럼, 속성에 단일 값을 갖게하는 것을 1차정규화라고한다.

 

제 2차 정규화 (2NF)

 

제 2차 정규화는, 1차 정규화를 진행한 데이터에 대해서 진행한다.

1차 정규화를 만족한 테이블의 엔터티의 일반 속성이 주식별자 전체에 종속이게 하는 것이다. 즉, 엔터티의 일반 속성이 주식별자 일부에만 종속이면 안된다는 것이다.

주식별자가 여러 칼럼으로 이루어진 복합키일 때, 어떤 속성이 기본키의 일부 칼럼에만 의존하는 것을 부분함수종속이라고 하는데, 이런 부분함수종속은 여러 이상현상을 일으키기때문에 이를 없애기 위해 따로 테이블을 만드는 것이 제 2차 정규화이다! 이 또한 예시와 같이 보겠다.

 

여기서 주식별자가 (학번, 강좌코드)라고 해보자.

학번 강좌코드 학생이름 강좌명
1 C01 철수 데이터베이스
1 C02 철수 운영체제
2 C02 영희 운영체제
3 C03 민수 컴퓨터네트워크

 

이때 이 테이블을 살펴보면, 학번은 학생 이름을 결정하고 강좌코드는 강좌명을 결정하기때문에 학생이름은 학번에 의존, 강좌명은 강좌코드에 의존 되어있다. 주식별자는 학번, 강좌코드인데!! 일반 속성이 현재 주식별자의 일부에만 의존하고 있는 것이다 ! 이런것이 부분함수종속이 발생하고있는 것이다. 이를 없애기 위해, 테이블을 따로 분리해야된다.

 

학생 테이블

학번 학생이름
1 철수
2 영희
3 민수

 

강좌 테이블

강좌코드 강좌명
C01 데이터베이스
C02 운영체제
C03 컴퓨터네트워크

 

수강 테이블

학번 강좌코드
1 C01
1 C02
2 C02
3 C03

 

이렇게 하면, 부분함수종속을 사라지게하여 엔터티의 일반속성이 주식별자 전체에 종속일 수 있게 된다!!

 

제 3차 정규화 (3NF)

 

제 3차 정규화는, 2차 정규화를 진행한 데이터에 대해서 진행한다.

2차 정규화를 만족한 테이블의 엔터티의 일반속성 간에는 서로 종속이지 않게 하는 것이다.

기본키, a속성, b속성이 있을때 기본키 -> a, a -> b 의 형태로 종속이라고 하자. 근데 이때 b가 기본키에 의존인게 아니라 a에 의존하는거를 이행적 함수 종속이라고 한다. 이런식으로 일반속성간에 종속이 일어나는 것을 이행적함수종속이라고 하는데, 이를 없애는 것이 제 3차 정규화 인것이다. 이 또한 예시로 같이 봐보겠다.

 

위의 강좌 테이블에서, 속성을 더 추가해보겠다!

강좌코드 강좌명 교수이름 교수 전화번호
C01 데이터베이스 김교수 010-1234-5678
C02 운영체제 이교수 010-2345-6789
C03 자료구조 박교수 010-3456-7890

 

여기서 기본 키는 강좌코드이고, 교수 전화번호는 교수 이름에 의존한다(이행적함수종속). 하지만 교수 전화번호가 강좌코드에 의존하는 것은 아니다! 즉, 현재 강좌코드 -> 교수이름, 교수이름 -> 교수 전화번호 가 일어나고 있는 것이다.

 

이러한 이행적 종속을 없애려면, 교수 정보를 아래와 같이 별도의 테이블로 분리한다.

 

강좌테이블

강좌코드 강좌명 교수이름
C01 데이터베이스 김교수
C02 운영체제 이교수
C03 자료구조 박교수

 

교수테이블

교수이름 교수 전화번호
김교수 010-1234-5678
이교수 010-2345-6789
박교수 010-3456-7890

 

이렇게하면, 이행적함수종속을 사라지게 하며 일반속성끼리의 종속이 일어나지 않게 된다!

 

 

BCNF

 

추가로, BCNF라는 것이 있다. 제 3차 정규화보다 더 엄격한 형태의 정규화이다. 제 3차 정규화에서, 모든 결정자를 후보키로 하면 된다. 여기서 결정자라는 것은 함수 종속 관계에서 -> 왼쪽에 오는 속성을 말한다. (a -> b 라면 a가 결정자). 즉 BCNF는, 제 3차 정규화를 적용한 이후, 결정자가 후보키가 아닌 경우도 제거하는, 결정자가 후보키가 아닌 함수 종속을 허용하지 않는 것이다. 이 또한 예제를 봐보자.

 

이는 3차 정규화까지 마친 테이블이다.

학번 강좌코드 교수 이름
1 C01 김교수
1 C02 이교수
2 C02 이교수
3 C03 박교수

 

여기서 기본키는 (학번, 강좌코드) 라고하자. 근데 이때 강좌코드 -> 교수이름 이 성립한다. 이 경우 강좌코드는 결정자이지만, 강좌코드는 기본키의 일부일 뿐 후보키는 아니다. 이는 BCNF를 위반하고 있는 것이다..!

 

그래서 아래와 같이 별도 테이블로 분리를 해야한다.

 

강좌테이블

강좌코드 교수이름
C01 김교수
C02 이교수
C03 박교수

 

수강테이블

학번 강좌코드
1 C01
1 C02
2 C02
3 C03

 

이렇게 분리를 하면, 강좌테이블에서는 강좌코드가 결정자이면서 후보키이다. 그리고 수강 테이블에서는 기본키가 (학번, 강좌코드)이기에 부분종속이나 이행종속이 없어서 BNCF를 만족한다!


이번에는, 정규화에 대해 알아보았다. 

간단히 정리해보자면,

  • 제 1차 정규화(1NF) : 원자값, 즉 단일값 보장
  • 제 2차 정규화(2NF) : 부분적 함수 종속 제거
  • 제 3차 정규화(3NF) : 이행적 함수 종속 제거
  • BCNF : 제 3차 + 모든 결정자는 후보키

이다!! 정규화는 문제를 많이 풀어야 더 잘 할 수 있을 거 같다..!!