[DataBase] 정규화(Normalization)

김태희·2025년 7월 4일
0

데이터베이스

목록 보기
2/3
post-thumbnail

정규화(Normalization)란 ?

데이터베이스 정규화는 관계형 데이터베이스에서 데이터의 중복을 최소화하고, 데이터의 일관성과 무결성을 확보하기 위해 테이블을 구조화하는 과정이다.

잘못 설계된 테이블에서는 데이터를 추가, 수정, 삭제할 때 예기치 않은 문제가 발생할 수 있다.

정규화는 이러한 '이상 현상'을 방지하는 핵심적인 역할을 한다.


정규화는 왜 필요한가? (데이터 이상 현상)

만약 정규화를 제대로 하지 않으면 다음과 같은 데이터 이상 현상이 발생할 수 있다.

아래와 같은 '수강 신청 테이블'이 있다고 가정해보자.

학생 ID학생 이름학과과목 코드과목명담당 교수
101김철수컴퓨터공학CS101컴퓨터 개론이영희
102박민지전자공학CS101컴퓨터 개론이영희
101김철수컴퓨터공학EE201회로 이론김민준
  1. 삽입 이상 (Insertion Anomaly)
    아직 수강 신청을 하지 않은 새로운 학생 '홍길동'을 추가하고 싶어도, 신청한 '과목 코드'가 없으면 데이터를 추가할 수 없다.

    즉, 불필요한 데이터(과목 정보)가 있어야만 학생 정보를 추가할 수 있는 모순이 발생한다.

  2. 갱신 이상 (Update Anomaly)
    '이영희' 교수가 '최영희'로 개명했다면, '컴퓨터 개론'을 수강하는 모든 학생의 데이터에서 교수 이름을 일일이 바꿔야 한다.

    만약 하나라도 빠뜨리면 데이터의 일관성이 깨진다.

  3. 삭제 이상 (Deletion Anomaly)
    '박민지' 학생이 '컴퓨터 개론' 수강을 취소하면 해당 행이 삭제된다.

    이때 '컴퓨터 개론' 과목을 수강하는 학생이 아무도 없다면, '컴퓨터 개론' 과목 정보 자체가 데이터베이스에서 사라져 버린다.

정규화는 바로 이러한 문제들을 해결하기 위해 테이블을 논리적으로 분해하는 과정이다.


정규화 과정 (1NF, 2NF, 3NF)

제1정규화 (1NF, First Normal Form)

규칙: 테이블의 모든 컬럼은 반드시 원자값을 가져야 한다.

원자값이라는 것은 컬럼의 값이 더 이상 쪼개질 수 없다는 의미이다.

[정규화 전]

학생 ID학생 이름수강 과목
101김철수컴퓨터 개론, 자료구조
102박민지회로 이론

위 테이블에서 '수강 과목' 컬럼은 두 개의 값을 가지고 있으므로 제1정규형을 위반한다.

[제1정규화 후]

학생 ID학생 이름수강 과목
101김철수컴퓨터 개론
101김철수자료구조
102박민지회로 이론

이렇게 각 행이 하나의 의미를 갖도록 값을 분리하면 제1정규화가 완료된다.

제2정규화 (2NF, Second Normal Form)

규칙: 제1정규화를 만족해야 하고, 부분 함수 종속성(Partial Functional Dependency)을 제거해야 한다.

쉽게 말해, 기본 키(Primary Key)가 여러 컬럼으로 구성된 복합 키일 경우, 테이블의 다른 모든 컬럼은 기본 키 전체에 종속되어야 한다. 기본 키의 일부에만 종속된 컬럼이 있다면 테이블을 분리해야 한다.

[정규화 전]

기본 키가 (학생 ID, 과목 코드)인 테이블이 있다.

학생 ID과목 코드학생 이름학과성적
101CS101김철수컴퓨터공학A+
101EE201김철수컴퓨터공학B
102CS101박민지전자공학A

학생 이름, 학과는 기본 키의 일부인 학생 ID에만 종속된다. (학생 ID만 알면 학생 이름을 알 수 있다)

성적학생 ID과목 코드 모두에 종속된다. (누가 어떤 과목을 들었는지 알아야 성적을 알 수 있다)

이처럼 기본 키의 일부에만 종속되는 '부분 함수 종속성'이 존재하므로 제2정규형을 위반한다.

[제2정규화 후]

부분 함수 종속성을 제거하기 위해 테이블을 다음과 같이 분리한다.

학생 테이블

학생 ID학생 이름학과
101김철수컴퓨터공학
102박민지전자공학

수강 테이블

학생 ID과목 코드성적
101CS101A+
101EE201B
102CS101A

이제 모든 컬럼이 각 테이블의 기본 키 전체에 종속되므로 제2정규화가 완료된다.

제3정규화 (3NF, Third Normal Form)

규칙: 제2정규화를 만족해야 하고, 이행적 함수 종속성(Transitive Functional Dependency)을 제거해야 한다.

이행적 함수 종속성이란, A → B이고 B → C일 때 A → C가 성립하는 관계를 말한다.

즉, 기본 키가 아닌 일반 컬럼이 다른 일반 컬럼을 결정해서는 안 된다.

[정규화 전]

과목 코드과목명담당 교수교수 연락처
CS101컴퓨터 개론이영희010-1111-1111
DS202자료구조김민준010-2222-2222
OS303운영체제이영희010-1111-1111

이 테이블에서 과목 코드는 기본 키이다.

과목 코드담당 교수 (과목 코드를 알면 담당 교수를 알 수 있다)

담당 교수교수 연락처 (담당 교수를 알면 그의 연락처를 알 수 있다)

기본 키가 아닌 '담당 교수' 컬럼이 '교수 연락처' 컬럼을 결정하고 있으므로 이행적 종속 관계가 존재한다. 이는 제3정규형을 위반한다. (교수 연락처가 바뀌면 여러 행을 수정해야 하는 갱신 이상 발생)

[제3정규화 후]

이행적 종속성을 제거하기 위해 테이블을 분리한다.

과목 테이블

과목 코드과목명담당 교수
CS101컴퓨터 개론이영희
DS202자료구조김민준
OS303운영체제이영희

교수 테이블

담당 교수교수 연락처
이영희010-1111-1111
김민준010-2222-2222

이렇게 분리하면 더 이상 일반 컬럼끼리 종속되는 관계가 사라지므로 제3정규화가 완료된다.

결론

  • 1NF: 값은 원자적이어야 한다.
  • 2NF: 부분 종속성을 제거해야 한다. (복합 키일 때)
  • 3NF: 이행 종속성을 제거해야 한다. (일반 컬럼끼리의 종속)

실무에서는 보통 제3정규화까지 마치는 것을 목표로 한다.

더 높은 단계의 정규화도 있지만, 3NF까지 진행하면 대부분의 데이터 이상 현상을 해결할 수 있다.

정규화는 데이터의 중복을 막고 무결성을 지키기 위한 필수적인 과정이다.

정규화된 데이터베이스는 장기적으로 훨씬 안정적이고 확장성 있는 시스템의 기반이 된다.

강의에서 교수님께서 항상 하시던 말씀이 있다.

정규화를 배우는 이유는 데이터베이스를 정규화 하기 위함이라기 보다는 설계시에 정규화가 필요없는 좋은 데이터베이스를 설계하기 위함이라고 하셨다.

정규화를 이해하고 애초부터 정규화가 필요없는 데이터베이스를 설계해야겠다.

다음 글에서는 무결성에 대해 다뤄보겠다.

0개의 댓글