[SQLD] 데이터 모델과 SQL - 정규화 요약

1. 정규화(Normalization)

정규화는 데이터베이스 설계의 핵심 부분으로, 데이터를 체계적으로 구성하여 효율과 일관성을 높이는 과정이다. 정규화가 중요한 이유는, 잘못 구성된 데이터베이스는 중복된 데이터, 업데이트 시의 문제, 데이터 무결성 문제 등을 야기할 수 있기 때문이다.

 

정규화의 기본 원칙

정규화의 기본적인 원칙은 중복을 최소화하고, 데이터 무결성을 유지하는 데 있다. 이를 통해 데이터를 더 작고, 관리하기 쉬운 부분으로 나누어 업데이트, 삭제, 추가 시 발생할 수 있는 문제들을 예방한다.

 

정규화 과정은 여러 단계로 나뉘어진다. 각 단계를 "정규형 (NF)"이라고 부른다. 데이터베이스 설계에 있어서 정규화는 매우 중요한 과정이다. 하지만 모든 것에는 장단점이 있듯이, 정규화도 장점과 함께 단점을 가지고 있다.

 

정규화의 장점

1. 데이터 중복 감소 : 정규화는 데이터 중복을 최소화한다. 이는 데이터의 일관성과 무결성을 유지하는 데 중요하다.

2. 데이터 무결성 향상 : 중복이 줄어들면서 데이터베이스 내의 오류 발생 확률이 감소하며, 데이터의 정확성과 신뢰성이 증가한다.

3. 쿼리 성능 개선 : 중복 데이터가 줄어들면 쿼리가 더 빨리 처리될 수 있다. 특히 대용량 데이터베이스에서 이 장점이 두드러진다.

4. 유지보수 용이성 : 데이터가 잘 조직되어 있으면 시스템의 변경이나 확장이 더 쉬워진다. 예를 들어서 새로운 데이터 유형을 추가하거나 혹은 기존 데이터를 수정 및 삭제할 때 오류 가능성이 줄어든다.

 

정규화의 단점

1. 조인 연산 증가 : 데이터가 여러 테이블로 분산되면서 필요한 정보를 얻기 위해 여러 테이블을 조인해야 한다. 이는 쿼리의 복잡성을 증가시키고 성능 저하를 가져올 수 있다.

2. 설계의 복잡성 증가 : 각 단계의 정규형을 적용할 때마다 테이블 구조가 복잡해질 수 있다. 이로 인해 데이터베이스 설계와 관리가 더 어려워질 수 있다.

3. 성능 저하 : 때로는 정규화가 성능을 저하시키는 일도 생긴다. 특히, 대량의 데이터를 처리해야 하는 응용 프로그램에서는 조인 연산이 성능에 부정적인 영향을 줄 수 있다.


2. 제 1 정규형 (1NF)

1NF는 테이블의 각 컬럼이 원자값을 가져야 한다는 규칙을 갖는다. 원자값이란 더 이상 나눌 수 없는 단일 값을 뜻한다.

예시

ID 취미
1 등산,독서
2 영화감상

위 테이블에서는 한 컬럼에 "등산,독서"와 같이 여러 취미를 쉼표로 구분하여 저장하였다. 이는 취미 컬럼이 원자값을 가지지 않는 것에 위배된다. 때문에 아래와 같이 1NF를 통하여 각 취미를 별도의 행으로 분리하여 각 컬럼이 원자값을 가지게 하는 것을 목표로 한다.

1NF 만족

ID 취미
1 등산
1 독서
2 영화감상

3. 제 2 정규형 (2NF)

2NF는 1NF를 만족하면서, 테이블의 모든 비키(Non-Key)컬럼이 테이블의 기본키에 완전히 함수적으로 종속되어야 한다.

예시

ID 취미 이름
1 등산 홍길동
1 독서 홍길동
2 영화감상 이순신

사용자 ID와 취미로 구성된 테이블에서 사용자 이름이 추가된 경우이다. 위 테이블에서는 이름은 ID에만 종속되어 있지만, 취미에는 종속되어 있지 않는다. 때문에 사용자 정보와 취미를 별도의 테이블로 분리하여 2NF를 만족시킬 수 있다.

2NF 만족

취미 테이블:

ID 취미
1 등산
1 독서
2 영화감상

 

사용자 테이블:

ID 이름
1 홍길동
2 이순신

4. 제 3 정규형 (3NF)

3NF는 2NF를 만족하면서 모든 비키(Non-Key) 컬럼이 기본키에만 직접적으로 종속되어야 된다. 때문에 이행적 종속을 제거하는데 목표를 갖는다.

예시

사용자 테이블:

ID 이름 도시 우편번호
1 홍길동 서울 1000
2 이순신 부산 2000

 

사용자 테이블에 도시,우편번호가 추가된 테이블이다. 위 테이블을 자세히 본다면 도시는 ID에 종속되어 있지만, 우편번호는 도시  컬럼에 종속되어 우편번호 -> 도시, 도시 -> ID 에 의존하게 됨에 따라 결국 우편번호 -> ID에 의존하게된다. 즉, 이행적으로 종속되어있음을 확인할 수 있다. 때문에 이행적 종속을 제거하고 도시 컬럼에만 종속시키기 위해 도시 테이블을 만든다.

3NF 만족

사용자 테이블 :

ID 이름 도시
1 홍길동 서울
2 이순신 부산

 

도시 테이블 :

도시 우편번호
서울 1000
부산 2000

5. BCNF (Boyce-Codd Normal Form)

BCNF는 3NF를 만족하면서, 모든 결정자가 후보키가 되어야 한다. 즉, BCNF에서는 모든 함수적 종속성이 후보키에만 의존해야 한다. 후보키는 테이블을 유일하게 식별할 수 있는 최소한의 컬럼 집합을 말한다. 이는 3NF에서 요구하는 모든 비키(Non-Key) 속성이 기본키에만 의존해야 한다는 규칙을 한 단계 더 발전시킨 것입니다.

예시

강의 스케줄 테이블:

강사 강의실 번호 강의시간
김교수 A101 오전
이교수 A101 오후
박교수 B201 오전
최교수 B201 오후

 

위 테이블은 대학교의 강의 스케줄에 관련된 테이블이다. 이 테이블에서는 강의실 번호, 강의 시간, 강사 3개의 컬럼이 있다. 각 강의실에서는 특정 시간에 특정 강사가 강의를 진행한다. 위 테이블에서 '강의실 번호'와 '강의시간'은 함께 강의를 구분하는 기본키다. 하지만 '강사'는 강의실번호와 강의시간에 의해 결정되는 것이 아닌, 각각 별도로 결정될 수 있다. 즉 '강사'는 결정자이지만 후보키가 아닌 것이다. 이는 BCNF를 위반하는 것이다.

BCNF 만족

강의 스케줄 테이블 :

강의실 번호 강의시간
A101 오전
A101 오후
B201 오전
B201 오후

 

강사 할당 테이블 :

강사 강의실 번호 강의시간
김교수 A101 오전
이교수 A101 오후
박교수 B201 오전
최교수 B201 오후

 

위처럼 분리함으로 각 테이블은 BCNF를 만족하게 된다. 강의 스케줄 테이블에서는 '강의실 번호'와 '강의 시간'이 유일한 결정자이며, 강사 할당 테이블에서는 '강사'가 해당 강의실과 시간에 의해 결정되기 때문이다.


6. 제 4 정규형 (4NF)

4NF는 3NF를 만족하면서 모든 비중복성(non-trivial) 다중값 종속성이 후보키에만 의존할 때 달성된다. 간단히 말해서 테이블 내에서 어떤 컬럼이 다른 컬럼에 종속되어 있지 않아야 한다.

다중값 종속성 (Multivalued Dependency)

다중값 종속성은 한 테이블 내에서 하나의 컬럼이 다른 컬럼에 종속되어 있으나, 이 종속성이 키에 대한 것이 아니라, 컬럼 간의 관계에 의한 것을 말한다. 예를들어 A 컬럼의 값이 B 컬럼의 값에 영향을 주지만, B 컬럼의 값은 A 컬럼의 값에 독립적으로 여러 값을 가질 수 있는 것을 의미한다.

예시

학생 테이블 :

이름 취미 언어
홍길동 등산 한국어
홍길동 등산 영어
홍길동 요리 한국어
홍길동 요리 영어
이순신 독서 한국어
이순신 독서 중국어

 

위 테이블에서 취미와 언어는 이름에 다중값 종속되어 있고, 서로 독립적이다. 이는 각 학생의 취미와 언어가 다른 컬럼에 의존하지 않고 별도로 여러 값을 가질 수 있음을 의미한다. 이런 구조는 데이터 중복을 야기하며, 업데이트 이상 현상을 초래하게 된다.

4NF 만족

학생취미 테이블 :

이름 취미
홍길동 등산
홍길동 요리
이순신 독서

 

학생언어 테이블 :

이름 언어
홍길동 한국어
홍길동 영어
이순신 중국어
이순신 중국어

 

이렇게 분리함으로써 각 테이블은 이름에 대한 다중값 종속성을 해결하며 4NF를 만족하게 된다. 이 구조에서 데이터 중복이 줄어들고, 데이터 무결성이 향상된다.


7. 제 5 정규형 (5NF)

5NF는 테이블이 프로젝션-조인 과정을 통해서 분해된 후에도 원래의 테이블로 다시 조합될 수 있을 때 달성된다. 이는 테이블에 존재하는 모든 조인 종속성이 후보키를 기반으로 한다는 것을 의미한다.

예시

초기 테이블 구조 (5NF 위반 가능성이 있는 테이블) :

강사 과목 교실
김교슈 수학 101
김교수 물리 102
이교수 수학 101
이교수 물리 103

 

위 테이블에서 각 강사가 여러 과목을 가르치고, 각 과목은 여려 교실에서 진행된다. 이 경우 테이블에는 실제로 존재하지 않는 조합(예시: 김교수 -물리 - 103호 교실)이 암시될 수 있다. 이것은 아래와 같은 분리를 통해 강사와 과목, 과목과 교실 간의 실제 관계를 더 명확하게 표현하여 중복을 줄일 수 있다. 각 테이블은 5NF를 만족하며 이들 테이블을 조인하여 원래의 데이터를 복원할 수 있게 된다.

5NF 만족

강사와 과목 테이블 :

강사 과목
김교슈 수학
김교수 물리
이교수 수학
이교수 물리

 

과목과 교실 테이블 :

과목 교실
수학 101
물리 102
수학 101
물리 103

최종 요약

데이터베이스 정규화는 데이터의 중복을 최소화하고, 무결성을 유지하는 데 목적을 둔 프로세스이다. 각 정규형은 데이터베이스 설계에서 특정 유형의 문제를 해결하도록 도와준다.

 

1. 제 1 정규형 (1NF)

목적: 모든 컬럼의 값이 원자값(Atomic Value)이 되도록 한다.
특징: 각 컬럼에는 단일 값만 포함되며, 반복되는 그룹이나 배열을 허용하지 않는다.

 

2. 제 2 정규형 (2NF)

목적: 부분 함수적 종속성을 제거한다.
조건: 1NF를 만족하며, 모든 비키(Non-Key) 속성이 기본키 전체에 대해 함수적으로 종속되어야 한다.

 

함수적 종속성 (Functional Dependency)

정의: 한 속성(또는 속성의 집합)의 값이 다른 속성의 값을 유일하게 결정하는 관계.
예시: '학생 ID'가 '학생 이름'을 결정한다. 즉, '학생 ID'를 알면 '학생 이름'을 알 수 있다.

 

3. 제 3 정규형 (3NF)

목적: 이행적 종속성을 제거한다.
조건: 2NF를 만족하며, 모든 비키 속성이 기본키에 직접적으로 종속되어야 한다.

 

이행적 종속성 (Transitive Dependency)

정의: 한 속성 A가 다른 속성 B에 함수적으로 종속되고, B가 또 다른 속성 C에 함수적으로 종속될 때, A는 C에 이행적으로 종속된다 한다.
예시: '학생 ID'가 '학과 ID'에 종속되고, '학과 ID'가 '학과장'에 종속된 경우, '학생 ID'는 '학과장'에 이행적으로 종속된다.

 

BCNF (Boyce-Codd Normal Form)

목적: 모든 결정자가 후보키가 되도록 한다.
조건: 3NF를 만족하며, 모든 결정자가 후보키 집합에 속해야 한다.

 

4. 제 4 정규형 (4NF)

목적: 다중값 종속성을 제거한다.
조건: 3NF or BCNF를 만족하며, 모든 비중복성 다중값 종속성이 후보키에만 의존해야 한다.

 

다중값 종속성 (Multivalued Dependency)

정의: 한 속성 A의 값이 다른 속성 B의 여러 값에 종속되는 경우를 말한다. 이 때, A의 값에 대한 B의 모든 값이 독립적으로 존재할 수 있다.
예시: '학생'이 '과목'과 '취미' 두 가지 속성에 독립적으로 종속되는 경우. '학생'이 '수학'과 '영어'를 듣고, '등산'과 '독서'를 취미로 가질 수 있다.

 

5. 제 5 정규형 (5NF)

목적: 조인 종속성을 해결한다.
조건: 모든 조인 종속성이 후보키에 기반해야 한다.

 

조인 종속성 (Join Dependency)

정의: 한 테이블이 여러 테이블로 분해되었을 때, 이 분해된 테이블들을 조인하여 원래의 테이블을 완벽하게 복원할 수 있는 속성의 관계를 뜻한다.
예시: '학생-과목' 테이블과 '과목-교수' 테이블이 있을 때, 이 두 테이블을 조인하면 '학생-과목-교수'의 원래 데이터를 정확히 복원할 수 있다.

 

정규화의 중요성

장점: 데이터 중복 감소, 무결성 향상, 쿼리 성능 개선, 유지보수 용이성 증가 등
단점: 과도한 정규화는 데이터베이스 설계의 복잡성을 증가시키고, 성능 저하를 야기할 수 있음