이상 현상(Anomaly)
불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산을 할 때 발생할 수 있는 부작용
정규화를 수행하지 않으면, 데이터의 중복이 발생하고 전체적인 무결성이 저하된다.
이상 현상으로 인해 현실세계의 실제 값과 데이터베이스에 저장된 값이 일치하지 않는 문제가 발생합니다.
이상 현상의 종류(Insert, Update, Delete)
1. 삽입 이상
데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제
2. 갱신 이상
중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 문제
3. 삭제 이상
튜플을 삭제하면 꼭 필요한 데이터까지 같이 삭제되는 데이터 손실 문제
이런 이상 현상을 해결하기 위한 솔루션은 바로 정규화(Normalization)
정규화(Normalization)
Attribute 간의 종속성으로 인한 이상현상이 발생하는 릴레이션을 분해하여 재디자인함으로써 이상현상을 없애는 과정
데이터의 중복 방지, 무결성을 충족하기 위해 데이터베이스를 설계하는 방법
정규화에는 아래와 같은 3가지 원칙이 있다
1. 정보의 무손실 : 분해된 릴레이션이 표현하는 정보는 분해되기 전의 정보를 모두 포함해야 한다.
2. 최소 데이터 중복 : 이상 현상을 제거, 데이터 중복을 최소화
3. 분리의 원칙 : 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리해서 표현
정규화의 장점 ==> 이상 현상을 해결하여 얻을 수 있는 장점
- 각종 이상 현상들을 해결할 수 있다
- 새로운 속성의 추가로 인해 DB 구조를 확장하는 경우, 구조의 변경을 최소화할 수 있다. 따라서 DB와 연동된 응용프로그램에 최소한의 영향만을 미쳐 응용프로그램의 생명을 연장시킨다
- 정규화된 릴레이션 간의 관계가 현실 세계에서의 개념들간의 관계를 잘 보여준다
정규화의 단점
반면, 릴레이션의 분해로 인해 릴레이션간의 연산이 많아져 응답 시간이 오히려 느려질 수도 있는 단점이 있다
이러한 경우 반정규화(De-normalization)을 통해서 성능을 향상시킬 수 있다.
반정규화(De-Normalization)
시스템의 성능 향상을 위해 정규화된 데이터 모델을 통합하는 작업으로, 의도적으로 정규화 원칙을 위배하는 행위이다. 따라서 정규화와 반정규화는 Trade-off 관계에 있다.
반정규화의 종류로는 테이블 통합/분할/추가, 중복 속성 추가 등이 있다.
반정규화를 수행하면 테이블이 단순해지고 관리 효율성이 증가하지만, 데이터의 일관성이나 무결성이 보장되지 않을 수 있다. 의도적으로 중복을 생성하여 검색 기능은 향상되지만, 갱신, 삭제 등의 성능은 낮아진다.
따라서 데이터의 중복 방지, 무결성 vs 데이터베이스의 성능, 단순화 사이의 우선순위를 잘 조절하여 정규화/반정규화를 수행해야 한다.
반정규화의 대상이 되는 경우는 다음과 같다.
1. 수행 속도가 많이 느린 경우
2. 테이블의 조인(JOIN)연산을 지나치게 사용하여 데이터를 조회하는 것이 기술적으로 어려운 경우
3. 테이블에 많은 데이터가 있고, 다량의 범위 혹은 특정 범위를 자주 처리해야 하는 경우
함수 종속
함수 종속성(Functional Dependency)은 어떤 테이블의 속성 A와 B에 대하여, A값에 의해 B값이 유일하게 정해지는 관계
- 완전 함수 종속 : 기본키를 구성하는 모든 속성에 종속되는 경우
- 부분 함수 종속 : 기본키를 구성하는 속성의 일부에 종속되거나, 기본키가 아닌 다른 속성에 종속되는 경우
- 이행적 함수 종속 : A, B, C 세 속성이 있고 A→B, B→C 종속 관계가 있을 때, A→C가 성립하는 경우
학생과 과목이 N : M 관계라고 했을 때 PK는 (학번, 과목번호)
이름과 학년은 학번만 알아도 유일하게 결정된다.
성적은 학번과 과목 번호를 모두 알아야 유일하게 결정된다
학년과 이름은 (학번, 과목번호)에 대해 부분 함수 종속이고, 성적은 완전 함수 종속
상품목록 테이블에서 보면
상품번호'를 알면 '소분류'를 알 수 있고, '소분류'을 알면 '대분류'도 알 수 있다
따라서 '상품번호'를 알면 '대분류'를 알 수 있으므로 이행적 함수 종속 관계
[ 제1 정규화 1NF ]
제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
[ 제2 정규화 2NF ]
제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미
[ 제3 정규화 3NF ]
제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.
기존의 테이블에서 학생 번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다.
그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다.
이행적 종속을 제거하는 이유는 비교적 간단하다. 예를 들어 501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 하자. 이행적 종속이 존재한다면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게 된다. 물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 이러한 번거로움을 해결하기 위해 제3 정규화를 하는 것이다.
즉, 학생 번호를 통해 강좌 이름을 참조하고, 강좌 이름으로 수강료를 참조하도록 테이블을 분해해야 하며 그 결과는 다음의 그림과 같다.
'CS' 카테고리의 다른 글
애플리케이션의 종류 (0) | 2024.01.04 |
---|---|
불변성(Immutable)과 빌더 패턴(Builder Pattern)에 대해 (0) | 2024.01.03 |
개발하면서 자주 만났던 이슈 및 용어 정리 (0) | 2023.04.19 |
[CS] 네트워크 (1) | 2023.02.28 |
[CS] Main Memory (0) | 2023.02.19 |