이상현상이란?
- 이상 현상(Anomaly)
- 테이블을 설계할 때 잘못 설계하여 데이터 삽입, 삭제, 수정할 때 논리적으로 생기는 오류
- 삽입 이상 : 데이터를 삽입 시 불필요한 정보까지 합께 삽입된다.
- 갱신 이상 : 데이터 갱신시 일부 튜플만 갱신되어 데이터 모순이 발생하는 현상
- 삭제 이상 : 데이터 삭제시, 의도하지 않은 정보까지 삭제되는 현상
이러한 현상을 예방하고, 효과적인 연산을 위해 데이터 정규화를 하게된다.
정규화에 알아보기 전에 함수 종속성에 대해서 먼저 알고 가야한다.
함수 종속성이란?
특정 속성(컬럼) A의 값이 정해지면, 다른 속성(컬럼)B의 값도 정해지는 종속 관계를 의미한다. ex) 이름과 이니셜 T.x → T.y
완전 함수 종속
- 예로, (이름, 가격, 카테고리) 라는 판매 릴레이션이 있다. 이름을 알아야, 가격과 카테고리를 알 수 있다. 이렇게 키가 아닌 값(가격, 카테고리) 들은 모두 기본키(이름)에 종속되도록 하는 것이 완전 함수 종속이다.
부분 함수 종속
- 키가 아닌 값들이 기본키가 아닌 다른 속성에 종속되거나, 복합키의 일부에 종속되는 것
예제 테이블 :
고객_id | 상품_id | 주문상품 | 수량 | 가격 |
001 | AAA | 베개 | 2 | 10000 |
001 | AAB | 이불 | 1 | 35000 |
002 | AAB | 이불 | 1 | 35000 |
003 | AAB | 이불 | 2 | 70000 |
- 여기서 수량은 고객 id와 상품 id에 종속되어있어 해당 관계는 완전 함수에 종속되어있다고 말한다.
- 주문상품은 기본 키를 구성하는 속성들의 부분 집합중 일부에만 종속되어있다. 따라서 주문 상품은 부분 함수에 종속
- 가격은 기본키와 더불어 기본키가 아닌 속성인 수량에도 종속되어 있어 부분 함수 종속이라 할 수 있다.
이행 함수 종속
- 속성 집합 Y가 속성 집합 X에 종속되고, 속성 집합 Z가 속성 집합 Y에 종속될 때, 속성 집합 Z가 X에 종속되는 경우, 즉 X → Y → Z 인 경우
- 위 예시로 따지면 가격이 이행 함수 종속이다. { 고객 id, 상품 id -> 수량 -> 가격}
정규화 단계
정규화란?
테이블 간의 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
제 1 정규화
- 예로 추신수와, 박세리는 여러개의 취미를 가지고 있기 때문에 1정규형을 만족하지 못하고 있다.그래서 1정규화를 진행하였다. -> 추신수 : 영화, 추신수 : 음악 이런식으로 분해된다.
- 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것
제 2 정규화
- 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 즉, 기본 키의 부분집합이 결정자가 되어서는 안된다.
- 여기서 기본키는 (학생번호, 강좌이름)의 복합키이다. 여기서 강의실은 이 복합키가아닌, 강좌이름으로 결정될 수 있다. 즉, 기본키의 부분키인 강좌이름이 결정자이기 때문에 테이블을 분해하여 제 2 정규형을 만족시킬 수 있다.
제 3 정규화
- 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 즉, 기본키가 아닌 다른 속성이 서로 종속되지 않도록 분리하는 것이다.
- 예로 학생번호를 강좌이름을 결정 -> 강좌이름은 수강료를 결정하고 있다.
- 즉 (학생번호, 강좌이름), (강좌이름, 수강료)로 테이블을 분해해야한다.
BCNF 정규화
- 제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보 키가 되도록 테이블을 분해는 것이다.
- 기본키는 (학생번호, 특강이름)이다. 기본키는 교수를 결정하고 있다. 근데, 교수가 특강이름을 결정하고 있다.
- 교수는 특강이름을 결정하는 결정자이지만, 후보키가 아니다. 그래서 BCNF 정규화를 만족시키기 위해 테이블을 분해할 수 있다.
반정규화
정규화를 통해 이상 현상은 해결되지만, 테이블이 지나치게 분리되면 데이터 조회 성능이 떨어질 수 있다.
이를 보완하기 위해 반정규화(Denormalization)를 통해 일부 데이터 중복을 허용하거나 테이블을 병합하여 조회 성능을 향상시킨다.
출처 및 참고 : https://mangkyu.tistory.com/110
출처 및 참고 : https://been2.tistory.com/40
'Database' 카테고리의 다른 글
[데이터베이스] 락과 DB 회복 (0) | 2024.11.28 |
---|---|
[데이터베이스] Transaction (트랜잭션) (1) | 2024.11.28 |
[데이터베이스] 인덱스 (2) | 2024.11.14 |
[데이터베이스] B-Tree 인덱스와 B+Tree 인덱스 (0) | 2024.11.13 |
[데이터베이스] 순차 I/O와 랜덤 I/O (2) | 2024.11.12 |