[작성일: 2023. 03. 24]
정규화(Normalization)
기본 목표
- 테이블 간의 중복된 데이터를 허용하지 않는 것
- 무결성을 유지하며 DB의 저장 공간을 줄일 수 있음.
정의
- 삽입, 수정, 삭제 시 발생할 수 있는 이상현상을 줄이는 과정
- 테이블을 분할하는 것이며 보통 3차 정규화까지 진행함.
이상현상(Anomaly)
- 테이블의 잘못된 설계로 인해 불필요한 데이터가 중복되어 공간이 낭비되는 현상
ID | Name | Major | Classcode | Classname | members |
apple | ahn | com. | C001 | Java | 30 |
apple | ahn | com. | C002 | DMBS | 35 |
apple | ahn | com. | C003 | Python | 30 |
kpple | kwon | mgmt. | A001 | Father | 10 |
lpple | lee | sea. | B001 | Ship | 10 |
삽입 이상
- 새로운 데이터를 넣기 위해 불필요한 데이터도 넣어야 하는 문제가 발생함.
- 과목이 정해지지 않은 학생을 넣으려면 수업명을 비워둘 수 없기 때문에 수업코드 X001, 수업명 '미정' 등을 새로 만들어서 넣어야 하는 이슈 발생.
갱신 이상
- 중복된 행 중에 일부만 변경해서 데이터가 불일치 하는 문제가 발생함.
- ahn 학생이 com 전공을 포기하고 machine으로 편입하면 학과 뿐만 아니라 연관된 3개의 데이터를 전부 바꿔야 함.
삭제 이상
- 행을 삭제하면 필요한 데이터까지 삭제되는 문제가 발생함.
- Father 수업을 폐강하면 kwon 데이터까지 삭제되는 실수 발생
정규화의 종류
1차 정규화
- 하나의 컬럼에는 하나의 정보(값)만 존재해야 함. ➡ 원자성
ex ) SimCity Game | ||||
User | Building | Cost | Place | PlaceSize |
Bach | Farm, Fac. | 50, 70 | Plain, City | 100, 200 |
Mozart | Farm, Fac. Cos. | 50, 70, 200 | Plain, City, City | 100, 200, 200 |
Tscai | Fac. | 70 | Shore | 500 |
- 위의 테이블처럼 정보를 합쳐서 작성하면 안 됨.
- 아래의 테이블처럼 작성한다면 1차 정규화는 패스해도 됨.
User | Billding | Cost | Place | PlaceSize |
Bach | Farm | 50 | Plain | 100 |
Bach | Fac. | 70 | City | 200 |
Mozart | Farm | 50 | Plain | 100 |
Mozart | Fac. | 70 | City | 200 |
Mozart | Cos. | 200 | City | 200 |
Tscai | Fac. | 70 | Shore | 500 |
2차 정규화
- 후보키(User+Building)의 진부분집합에서 부분함수 종속성을 제거하는 작업
- Place로 작업할 수 없는 이유는 Place가 후보키가 아니기 때문임. (3차 정규화에서 진행)
- 부분함수적 종속을 완전함수적 종속으로 만드는 과정
- 아래의 표가 2차 정규화가 된 테이블, Building과 Cost가 독립하여 새로운 테이블이 생김.
User | Building | Place | PlaceSize |
Bach | Farm | Plain | 100 |
Bach | Fac. | City | 200 |
Mozart | Farm | Plain | 100 |
Mozart | Fac. | City | 200 |
Mozart | Cos. | City | 200 |
Tscai | Fac. | Shore | 500 |
Building | Cost |
Farm | 50 |
Fac. | 70 |
Cos. | 200 |
3차 정규화
- 1차 정규화 및 2차 정규화를 만족하고, 이행적 함수적 종속을 갖지 않는 정규형
- 이행적 함수적 종속: A값을 알면 B값을 알고, B값을 알면 C값을 알 수 있는 관계
- 종속된 것이 있는데 PK 소속이 아닌 종속
Place | PlaceSize |
Plain | 100 |
City | 200 |
Shore | 500 |
🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.