데이터베이스에서 정규화란 테이블을 분해하여 데이터 중복을 없애고, 의존성을 보장하며, 잘못된 연산(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이다.
헷갈려잉
'공부' 카테고리의 다른 글
[Java] 싱글턴 패턴 (Singleton pattern) (0) | 2025.04.08 |
---|---|
AWS Cloud (2) Storage, Databases, Security (1) | 2024.11.27 |
AWS Cloud (1) EC2, Infrastructure, Networking (0) | 2024.11.27 |
[React] Styled Component에서 props로 공통 스타일 정의하기 (0) | 2024.08.09 |
Vite 환경변수 설정하기 (1) | 2024.06.26 |