공부

[DB] 정규화 (Normalization)

avocado8 2025. 4. 8. 17:21

 

데이터베이스에서 정규화란 테이블을 분해하여 데이터 중복을 없애고, 의존성을 보장하며, 잘못된 연산(Analomy)이 수행되지 않도록 하는 것이다. 중복을 제거해 데이터 무결성을 유지하는 방법이라고 보면 되겠다.

 

1NF, 2NF, 3NF, BCNF, ... 순으로 정규화 단계가 있으며 각 단계는 이전 단계의 정규화 조건을 만족해야 한다.

 

제1정규형 (1NF)

  • column의 값이 단 하나의 value만 가져야 한다.

아래 표의 첫번째 row를 보면, subject column에서 2개의 value를 가진다. 즉 아래 표는 제1정규형을 만족하지 못한다.

Student Age Subject
A 15 Biology, Maths
B 14 Maths
C 17 Maths

 

위 표를 1NF를 만족하도록 분해하자. 한번에 하나의 값만 갖도록 나눠주면 된다.

Student Age Subject
A 15 Biology
A 15 Maths
B 14 Maths
C 17 Maths

 

 

제2정규형 (2NF)

  • 어떤 column의 primary key도 partial dependency(부분 함수 종속)를 가져서는 안 된다.

기본키가 복합키일 때, 그 복합키의 부분집합이 결정자가 되어서는 안 된다는 뜻이다. 테이블의 모든 column은 반드시 "entire concatenated key(복합키 모두)"에 의존적이어야 한다. 다른 말로는 완전 함수 종속 상태로 만들어야 한다.

 

뭔소리냐면

위의 1NF 테이블을 다시 보자.

Student Age Subject
A 15 Biology
A 15 Maths
B 14 Maths
C 17 Maths

 

위 테이블에서 {Student, Subject} 는 기본키가 될 수 있다. (후보키라는 뜻)

이때 Age는 {Student, Subject} 라는 복합키에서 Student에만 의존한다. Student만 가지고도 Age가 결정되기 때문. 이러면 안 된다는 뜻이다.

그럼 이를 2NF로 바꾸려면? : 테이블을 두 개로 나누면 된다.

 

1) Student 테이블

Student Age
A 15
B 14
C 17

 

2) Subject 테이블

Student Subject
A Biology
A Maths
B Maths
C Maths

 

이러면 이제 두 테이블 모두 2NF를 만족한다.

 

 

제3정규형 (3NF)

  • 모든 non-prime attribute는 primary key에 의존적이어야 한다.

즉, non-prime attribute가 다른 non-prime attribute에 의해 결정되어서는 안 된다.

다른 말로는 이행 종속성(Transitive Dependency)를 제거한다고 한다.

 

아래와 같은 attribute들을 가진 테이블이 있다고 치자.

Student_id Student_name DOB Street City State Zip

 

테이블의 PK는 Student_id 이다. 나머지 요소들도 이 PK로 결정할 수 있을 것이다.

그런데 테이블을 보면, Street - City - State는 주소다. 즉 우편번호인 Zip에 의해 결정되는 속성들이다. 이러면 안 된다는 뜻이다.

그러니 PK만으로 속성값들이 결정되도록 테이블을 분리해주면 된다.

 

1) Student_Detail 테이블

Student_id Student_name DOB Zip

 

2) Address 테이블

Zip Street City State

 

Zip을 PK로 하는 테이블을 분리하면 이제 테이블의 각 요소들은 PK에만 의존해 결정된다.

 

 

BCNF(Boyce-Codd Normal Form)

  • 모든 결정자가 후보키 집합에 속해야 한다.

즉, 모든 결정자가 키라면 BCNF이다.

 

 

 

헷갈려잉