💽 DataBase
DB 정규화
정의
데이터 중복과 Insertion, Update, Deletion Anomaly를 최소화하기 위해 일련의 Normal Forms(NF)에 따라 Relational DB를 구성하는 과정
Normal Forms(NF)
정규화하기 위해 준수해야하는 몇 가지 Rules
정규화 과정
- 처음부터 순차적으로 진행
- NF을 만족하지 못하면, 만족하도록 테이블 구조를 조정
- 앞 단계를 만족해야, 다음 단계로 진행할 수 있다.
- FD와 Key만으로 정의되는 NF
- 3NF까지 도달하면, 정규화 됐다고 말하기도 함
- 실무에서는 3NF, BCNF까지 진행(많이 해도 4NF 정도까지만)
테이블 설명
- 임직원의 월급 계좌를 관리하는 테이블
- 월급 계좌는 국민 은행 or 우리 은행
- 한 임직원이 하나 이상의 월급 계좌를 등록하고, 월급 비율(Ratio)를 조정할 수 있다.
- 각 계좌마다 등급(Class)가 있다. (국민: STAR → PRESTIGE → LOYAL, 우리: BRONZE → SILVER → GOLD)
- 한 계좌는 하나 이상의 현금 카드와 연동될 수 있다.
Key
- Super Key: Table에서 Tuple들을 Unique하게 식별할 수 있는 Attributes Set
- (Candidate) Key: 하나의 Attribute라도 제거하면 Unique하게 Tuple들을 식별할 수 없는 Super Key
- {account_id}, {bank_name, account_name}
- Primary Key: Table에서 Tuple들을 Unique하게 식별하려고 선택된 (Candidate) Key
- {account_id}
- Prime Attribute: 임의의 Key에 속하는 Attribute
- account_id, bank_name, account_num
- Non-Prime Attribute: 어떠한 Key에도 속하지 않는 Attribute
- class, ratio, empl_id, empl_name, card_id
Functional Depedency
- {account_id} → {bank_name, account_num, class, ratio, empl_id, empl_name, card_id}
정규화(Normalization)
1NF : Attribute의 Value는 반드시 나눠질 수 없는 단일한 값이어야 한다.
- 하지만 중복 데이터 발생
- Ratio 총합이 1이 넘음
- Primary Key도 변경해야한다.
- PK를 {account_id, card_id}로 변경하면
- 모든 Non-Prime Attribute들이 중복된다.
→ 모든 Non-Prime Attribute들이 {account_id, card_id}에 Partially Dependent 하다.
2NF : 모든 Non-Prime Attribute는 모든 Key에 Fully Functionally Dependent 해야 한다.
기본키가 아닌 모든 속성이 기본키에 완전 함수적 종속인 상태
3NF : 모든 Non-Prime Attribute는 어떤 Key에도 Transitively Dependent하면 안된다.
Non-Prime Attribute와 Non-Prime Attribute 사이에는 FD가 있으면 안된다.
Transitive FD
if X → Y & Y → Z면, X → Z는 Transitive FD Y, Z 둘 다 어느 키의 부분 집합이 아닐 때
3NF까지 되면 “정규화 됐다.” 라고 말할 수 있다.
BCNF : 모든 유효한 Non-Trivial FD X → Y는 X가 Super Key여야 한다.
Non-Trivial FD
X → Y일 때, Y는 X의 부분집합이 아닐 경우
역정규화(Denormalization)
과도한 JOIN과 중복 데이터 최소화 사이에서 적정 수준으로 조절