DB 복습 INDEX
① DB 기본 이론 (DBMS 개념 / 데이터 언어)
② 데이터 모델링 (데이터모델 / 객체 / 속성)
③ 정규화 (이상현상 / 이행적 함수 종속)
④ 관계 데이터연산 (관계 대수 /관계해석 /SQL)
⑤ 트랜잭션 (트랜잭션 / 장애 / 회복)
정규화 Normalization
정규화란 하나의 테이블을 여러개의 테이블로 분해해 중복성, 종속성을 줄이는 기법을 말한다.
함수적 종속 관계 : "Y는 X에 함수 종속적이다" = X → Y
* 이행적 함수 종속
X → Y
Y → Z
X → Z
이는 데이터 구조의 안정성을 최대화하고 삽입, 수정, 삭제 이상의 발생을 방지한다.
이상현상 Anomaly
이상현상은 DB내 데이터 중복 문제로 관계 연산을 처리할 때 발생하는 곤란한 현상을 말한다.
- 삽입 이상 : 데이터를 삽입할 때 원하지 않은 값도 같이 삽입되는 현상
- 삭제 이상 : 한 투플을 삭제할 때 연쇄 삭제 현상으로 인한 정보 손실 현상
- 갱신 이상 : 투플의 속성값을 갱신할 때 일부 투플의 정보만 갱신되어 정보의 모순이 발생하는 현상
정규화의 장점
- 중복 제거
- Null 값 최소화
- 데이터 구조 안정성 최대화
정규화 과정
- 제 1 정규형 (1NF) : 릴레이션의 모든 도메인이 원자값이다. / 유일한 값, 식별성
- 제 2 정규형 (2NF) : 부분 함수적 종속 제거 (=모든 속성이 기본키에 완전 함수적 종속)
- 제 3 정규형 (3NF) : 이행적 함수 종속 제거
- 보이스 코드 정규형 (BCNF) : 모든 결정자가 후보키
- 제 4 정규형 (4NF) : 다치 종속 제거
- 제 5 정규형 (5NF) : 조인 종속 제거
논리적 데이터 모델을 구축하는데 3차 정규형까지 하는게 기본적이다.
정규화 과정이 깊어질 수록 제약조건이 많아져 설계하기 까다로운 릴레이션이 된다.
정규화의 과정을 예시를 들어 보면 이해하기 쉽다.
여기 고객 정보 테이블이 하나 있다.
이 고객 정보 테이블의 기본키는 고객아이디와 이벤트 번호 두개다.
여기서 이상 현상이 발생한다.
무조건 이벤트에 참여한 고객만 이 테이블에 삽입 가능하니 삽입 이상이 발생한다.
또 같은 고객이 여러개의 이벤트에 참여했다면 이벤트번호와 당첨여부를 제외하고 모두 중복이 된다.
이때 만약
이벤트 E010에 당첨된 apple 고객의 등급을 변경한다면
E001과 E005에 참여한 apple고객의 등급은 그대로이기 때문에 갱신 이상이 발생한다.
그리고 만약 orange 고객이 이벤트 E004의 참여를 취소한다면 orange 고객의 등급, 할인율 정보도 삭제되어 삭제 이상이 발생한다.
일단 원자값으로 도메인을 만들기 위해 제 2 정규화 과정이 필요하다.
제 2 정규화 후 고객 테이블과 이벤트 참여 테이블로 분해되었다.
하지만 완벽한 릴레이션은 아니다.
이상 현상이 또 발생한다.
고객 등급에 vip, gold, silver 외에 bronze가 생긴대도
브론즈 고객이 없으면 삽입되지 않는다. 삽입이상이다.
등급이 변경되면 자동으로 할인율도 같이 변경되어야 한다. 갱신이상이다.
고객이 탈퇴하면 특정한 등급과 할인율도 같이 삭제된다. 정보의 손실이 발생한다. 삭제 이상이다.
이 테이블은 이행적 함수 종속 관계에 있다.
고객아이디 → 등급
고객아이디 → 할인율
등급 → 할인율
고객아이디 + 이벤트 번호 → 이벤트 당첨여부
이행적 함수적 종속을 제거하기 위해 제 3 정규형 과정이 필요하다.
고객 테이블에서 등급과 할인율 정보를 분해했다.
여기까지 모든 도메인이 원자값이고 (1NF) 부분적 함수 종속을 제거하고 (2NF) 이행적 함수 종속을 제거했다. (3NF)
하나였던 테이블이 세개로 분해됐다.
고객 테이블
고객 등급 테이블
이벤트 참여 테이블
정규화를 진행하면 데이터의 삽입, 수정, 삭제 관리가 쉬워진다. 하지만 오히려 검색이 오래걸릴 수 있다.
이벤트 E001에 당첨된 고객 중 실버 등급인 고객 정보를 가져와야 한다고 하면
세 테이블을 모두 사용할 수 밖에 없다.
+참고
책정보, 데이터베이스 개론 : 네이버 책 (naver.com)
'Database' 카테고리의 다른 글
[DataBase ⑤] DB 장애와 회복 (트랜잭션 / 장애 / 회복) (2) | 2021.10.07 |
---|---|
[DataBase ④] 관계 데이터 연산 (관계 대수 / 관계 해석 / SQL) (0) | 2021.09.29 |
[DataBase ②] 데이터 모델링 (데이터모델 / 객체 / 속성 ) (0) | 2021.09.24 |
[DataBase ①] DB 기본 이론 (DBMS 개념 / 데이터 언어) (0) | 2021.09.16 |
SQL 문법 정리 (DDL / DML / VIEW ) (0) | 2020.08.12 |
댓글