정규화(Normalization)
(1) 정규화의 목적
- 테이블 간 중복된 데이터를 허용하지 않는 것이 목표
- 무결성을 유지하면서 DB의 저장공간을 줄일 수 있음
order_list 테이블
order_no prod location trans_fee
1 pencil seoul 2500
2 plate jeju 5000
3 nintendo seoul 2500
order_list에서 location이 seoul이면 무조건 2500원인데
왜 2500이라는 데이터를 보관하고 있는가?
trans_fee_map
location trans_fee
seoul 2500
jeju 4000
기존 order_list에서 trans_fee 컬럼을 삭제하고
새로운 코드 테이블을 생성하여 용량을 줄이는 것
=> 정규화
(2) 정규화의 정의
- 데이터의 삽입, 삭제, 수정 시 발생할 수 있는
이상현상(anomaly)을 줄이는 과정
- 데이터(테이블)을 분리하는 것으로 보통 3차까지 진행
(3) 이상현상(anomaly)
테이블의 잘못된 설계로 인해 불필요한 데이터가 중복되어
공간이 낭비되는 현상
id name major classcode classname members
apple kim com. C001 Java 30
apple kim com. C002 DBMS 35
apple kim com. C003 Python 30
lenon john music A001 Drum 10
sunshin lee sea B001 Ship 10
1) 삽입 이상
새로운 데이터를 넣을 때 불필요한 데이터가 들어가는 문제
왜? 종속적인 데이터도 넣어야 하기 때문에 +
수강과목을 정하지 않은 학생을 넣을 때에 수업명을 비울 수 없어
X001, TBD 등을 만들어 넣어야 함
2) 갱신 이상
중복된 행 중 일부만 변경하면 데이터의 불일치 발생
kim이 com. 전공을 때려치고 social 전공으로 바꾸면
반드시 3개 행 모두를 바꿔야 하지만
일부만 수정하면 이상 현상이 발생
3) 삭제 이상
행을 삭제하면 필요한 데이터까지 삭제되는 문제
Drum 수업을 폐강하면 john lenon 데이터가 삭제됨
(4) 정규화의 종류
1) 1차 정규화
- 하나의 컬럼에는 하나의 정보(값)만 존재
=> 원자성
* Simcity
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
=> User가 건물을 건설할 때마다 해당 row값을 update 필요
=> update는 delete -> insert으로 시스템에 부하를 줌
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) 2차 정규화
- 후보키의 진부분집합에서 부분함수 종속성을 제거
부분함수적 종속을 완전함수적 종속으로 바꾸는 과정
- 진부분집합
A, B, C : (A), (B), (C), (A,B), (B,C), (A,C)
(A,B,C)는 아님
'데이터베이스' 카테고리의 다른 글
DB jdbc로 java와 연결하기 (0) | 2024.11.23 |
---|---|
DB sql 기본문법2 (1) | 2024.11.19 |
DB sql 기본문법1 (1) | 2024.11.18 |