
정규화(Normalization)
📌 정규화란?
정규화(Normalization)란 관계형 데이터베이스 설계에서 중복을 최소화하도록 데이터를 구조화하는 작업이다. 정규화를 해줌으로써 삽입, 삭제, 갱신 등 이상현상이 발생할 가능성이 줄어든다. 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다. 일반적으로 크고, 제대로 조직되지 않은 테이블들을 무손실 분해해서 작고 잘 조직된 테이블로 나누는 것을 말한다.
✅ 제1정규화
테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
예를 들어, 아래와 같이 (이름, 나이, 취미)를 컬럼으로 가진 [고객취미] 테이블이 있다.

이 테이블에서 장원영과 아이유는 취미가 여러개이기 때문에 제1정규형이 아니다.
그래서 이 테이블은 제1정규화 대상이 되고, 이를 제1정규화 해서 분해할 수 있다.
제1정규화가 진행된 테이블은 아래와 같다. 모든 컬럼이 원자값을 가진다.

✅ 제2정규화
제2정규화란 제1정규화가 진행된 테이블에 대해, 완전 함수 종족을 만족하도록 테이블을 분해하는 과정이다.
여기서 말하는 '완전 함수 종속'이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.
이를 "부분 함수 종속 제거" 라고도 한다. 다시 말해, 기본키 중에 특정 컬럼에만 종속된 컬럼이 없어야 된다는 것이다.
* 결정자: 릴레이션에서 다른 속성을 고유하게 결정하는 속성


이 테이블에서 기본키(primary key) 는 (학생번호, 강좌이름)이며 복합키 구조이다.
(학생번호, 강좌이름)이 학생의 성적을 결정하고 있다.
(학생번호, 강좌이름) --> (성적)
하지만 강의실 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다.
(강좌이름) --> (강의실)
기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자가 되기 때문에 결국 위 테이블은 제2정규형을 만족하지 못한다. 이 테이블이 제2정규형이 되기 위해서는 강의실을 떼어 내어 별도의 테이블로 관리해야 한다.
제2정규화를 쉽게 설명하면, 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업이다. 현재 테이블에서 강의실 컬럼은 강좌이름에 따라서만 결정이된다. 나머지 컬럼은 영향을 미치지 않는다. 즉 하나의 컬럼에만 종속이 되어있다는 것이다.
이러한 경우에 강의실이라는 컬럼은 강좌이름이라는 컬럼에 부분적 함수 종속(partial dependency)이 있다고 말할 수 있는 것이다. 즉, 복합 기본키(composite primary key들) 중 하나에만 종속관계를 보이는 것, 그것을 다른 테이블로 빼버리는 것이 제 2 정규형이다.
위 테이블을 제2정규화 하면 아래와 같은 모습이 된다.



그럼 테이블을 위처럼 제2정규화하면 어떤 장점이 있을까? 예를 들어 생활영어 강의실이 변경되었다고 가정해 보자.
제2정규화 되지 않은 상태에서는 여러 행을 수정해주어야 하지만, 강의실 테이블에서 한 번만 수정 해 주면 된다.
✅ 제3정규화
제3정규화란 제2정규화를 진행한 테이블에 대해 이행 함수 종속을 없애기 위해 테이블을 분해하는 것이다.
여기서 말하는 '이행 함수 종속'이라는 것은 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미한다.
이렇게 설명하면 조금 어려울 수 있는데, 사실 제2정규형의 개념을 이해했다면, 3정규형은 더 쉽게 이해할 수 있다.
아래의 표는 부분 함수 종속(particial dependency)이 없다. 애초부터 복합 기본키(composite primary key) 자체가 없기 때문이다. 이러한 테이블에서 현재 출신대학이라는 컬럼은 프로그램(primarykey)와는 아무 관계과 없다. 그저 강사라는 컬럼에 종속되어 있을 뿐이다.

위에서 설명한 것처럼 제2정규화와 다르게 부분함수종속(particial dependency)이 없으면서 기본키가 아닌 어떠한 칼럼에 종속되는 형태를 보일때 이것을 다른 테이블로 따로 빼주는 것을 제3정규형이라고 한다.
제3정규화를 하면 제2정규화와 마찬가지로 수정이 편리해진다는 장점이 있으나,
강사의 출신대학을 알아보려면, 다른 테이블을 같이 참조해야 하는 번거로움이 있다.
위 테이블을 제3정규화 시키면 아래와 같아진다.

✅ BCNF 정규화 (보이스-코드) 정규형
BCNF정규화란 제3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
이렇게 설명하면 조금 어렵기 때문에 아래 특강수강 테이블을 살펴보자.


특강수강 테이블의 기본키는 복합키로 (학생번호, 특강이름)이다. 그리고 이 기본키는 교수를 결정한다.
하지만 이 테이블에서 교수도 특강이름을 결정한다.
교수는 특강이름을 결정하는 결정자이지만, 후보키는 아니다.
그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 다음과 같이 분해할 수 있다.



★ 포스팅에 참조한 블로그 ★
정규화의 개념과 단계별 조건▼
정규화의 개념과 단계별 조건
작성하다가 날라갔다. 그래서 다시쓴다 괜찮다. 난 강하니까.. 다시 복습한다고 생각하자.. 정규화란? 정규화는 관계형 데이터 모델이서 데이터의 중복성을 제거하여 이상 현상을 방지하고, 데
velog.io
정규화(Normalization) - 1차 2차 3차 BCNF ▼
정규화(Normalization) - 1차 2차 3차 BCNF
정규화 데이터베이스의 설계를 재구성하는 테크닉. 불필요한 데이터(redundancy)제거. 삽입/갱신/삭제 시 발생할 수 있는 각종 이상현상(Anamolies)들을 방지. "논리적"로 데이터를 저장 - 데이터 테이
jiyoungtt.tistory.com
정규화(Normalization) 쉽게 이해하기 ▼
[Database] 정규화(Normalization) 쉽게 이해하기
지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz
mangkyu.tistory.com
'SQL&DataBase' 카테고리의 다른 글
| [SQLD] JOIN (Inner, Outer, Self, Natural, Cross JOIN) (6) | 2024.11.17 |
|---|---|
| [SQLD] NULL 관련 함수, CASE, DECODE, SQL실행순서 (5) | 2024.11.16 |
| [SQLD] SQL 기본 함수 (문자열, 숫자, 날짜 등) (7) | 2024.11.16 |
| [SQLD] 정규화, 반정규화 (36) | 2024.11.16 |
| [SQLD] 데이터모델링의 이해 (6) | 2024.11.16 |