RDB 정규화와 예시
정규화 (Normalization)란?
데이터 중복과 insertion, update, deletion anomaly를 최소화하기 위해 일련의 normal forms(NF)에 따라 relation DB 를 구성하는 과정
단어
결정자
- 후보키 : 기본키들이 될 수 있는 속성들, 어느 한 attribute라도 제거하면 unique하게 tuples를 식별할 수 없는 super key
- 기본키 : RDB에서 각 행을 고유하게 식별할 수 있는 역할을 하는 속성 또는 속성 집합.
유일한 값(Null 제외)을 가진 컬럼 (Id, 사번 등...)
- 슈퍼키 : table에서 tuple들을 unique하게 식별할 수 있는 attributes set
- 외래키 : 다른 테이블의 기본키와 연결해주는 컬럼. 이 외래키를 통해 다른 테이블과의 관계를 형성하고 데이터의 무결성을 유지할 수 있음
슈퍼키 : table에서 tuple들을 unique하게 식별할 수 있는 attributes set , 키들을 모두 포함하고 있는 개념
후보키 : account_id, {bank_name, account_num}
기본키 : account_id
prime attribute : 임의의 key에 속하는 attribute = account_id, bank_name, account_num
non-prime attribute : 어떠한 key에도 속하지 않는 attribute = class, ratio, emple_id, empl_name, card_id
원본 테이블
먼저 테이블의 key와 FD 관계를 정리해야함
- functional dependency
정규화
- 1정규화 : attribute의 value는 반드시 나눠질 수 없는 단일한 값이어야함
후보키 : {account_id, card_id}, {bank_name, account_num, card_id}
- 2정규화 : 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업
partial dependency를 제거한 테이블
장점 : 중복 데이터가 제거됨
단점 : 분리한 테이블로 인해 한 테이블에서 모든 정보를 알수없음
- 3정규화 : 일반 컬럼에만 종속된 컬럼은 다른 테이블로 빼기
transitive FD를 제거, 즉 모든 non-prime attribute는 어떤 key에도 transitively dependent 하면 안됨
※ transitive FD : X->Y & Y->Z 일 때, X->Z인 관계
empl_id와 empl_name에 중복 데이터가 존재
- BCNF : 모든 유효한 non-trivial FD X->Y는 X가 superkey여야 함
※ non-trivial FD : X->Y FD가 있을 때, Y가 X의 부분집합이 아니면 X->Y는 non trivial FD 관계임
은행 별 계좌 등급은 서로 겹치지 않으니, class에 의해 bank_name이 결정됨. 여기서 X는 class, Y는 bank_name이여서 non trivial FD 관계임. But X는 super key가 아님
그래서 테이블을 나눠야함
비정규화
DB를 설계할 때, 과도한 조인과 중복 데이터 최소화 사이에서 적정 수준을 잘 선택할 필요가 있음
중의적인 표현임
→ unknown, unavailable, withheld, not applicable
- 엔티티 연관관계 및 fetch 전략을 통해 null값 제어 (중요도 낮음)
- null 단점
- null은 중의적인 표현임 → unknown, unavailable, withheld, not applicable
- null 단점