정규화 (Normalization)란 ?
정규화의 기본 목표는 데이터의 중복을 없애는 것이다.
중복을 허용하지 않음으로써 삽입, 갱신, 삭제 시에 발생할 수 있는 각종 이상현상을 방지하여 데이터의 무결성을 유지한다.
이로써 데이터베이스의 저장 용량또한 효율적으로 관리할 수 있다.
💡 데이터의 무결성이란 ?
데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미한다.
정확성 : 중복이나 누락이 없는 상태
일관성 : 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태
정규화의 장/단점
장점
- 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
- 무결성을 지키고 이상 현상을 방지한다.
- 테이블 구성을 논리적이고 직관적으로 할 수 있도록 한다.
- 데이터베이스 구조의 확장에 용이해진다.
단점
- 릴레이션의 분해로 인해 릴레이션 간의 JOIN 연산이 많아진다.
- 질의에 대한 응답시간이 느려질 수도 있다.
- 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. → 따라서 데이터를 처리할 때 속도가 빨라질 수도 느려질 수도 있다.
- 만약 조인이 발생해 성능 저하가 나타나면 반정규화(Denomalization)를 적용할 수도 있다.
정규화의 종류
정규화에는 여러 단계가 있지만 대체적으로 1 ~ 3 단계 정규화까지의 과정을 거친다.
제 1 정규화(1NF)
테이블 컬럼이 원자값(하나의 값)을 가지도록 테이블을 분리시키는 것을 말한다.
만족해야 할 조건은 다음과 같다.
- 어떤 릴레이션에 속한 모든 도메인이 원자값만으로 구성되어야 한다.
- 모든 속성에 반복되는 그룹이 나타나지 않는다.
- 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.
현재 테이블은 전화번호를 여러개 가지고 있어 원자값이 아니다. 따라서 1NF에 맞추기 위해서는 아래와 같이 분리할 수 있다.
제 2정규화(2NF)
테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 한다.
조금 쉽게 말하면 테이블에서 기본키가 복합키(키1, 키2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안된다.
기본키의 부분집합 키가 결정자가 되어선 안된다는 것
Manufacture과 Model이 키(복합키)가 되어 Model Full Name을 결정한다.
Manufacturer Country는 오로지 Manufacturer에 의해서만 결정된다. 이를 부분 함수 종속이라고 한다.
따라서, Model과 Manufacturer Country는 아무런 연관 관계가 없는 상황이다.
결국 완전 함수적 종속을 충족시키지 못하고 있는 테이블이다.
다시 말하면, 부분 함수 종속은 기본키로 복합키가 쓰이는 상황에서 복합키 중 하나의 속성이 다른 속성값을 결정하는데 영향을 미치지 않는 것을 말한다. (또는 하나의 속성만으로 다른 속성값을 결정하는 것을 말한다.)
부분 함수 종속을 해결하기 위해 테이블을 아래와 같이 나눠서 2NF를 만족할 수 있다.
제 3정규화(3NF)
2NF가 진행된 테이블에서 이행적 종속을 없애기 위해 테이블을 분리하는 것이다.
이행적 종속 : A → B, B → C면 A → C가 성립된다.
아래 두가지 조건을 만족시켜야 한다.
- 릴레이션이 2NF에 만족한다.
- 기본키가 아닌 속성들은 기본키에 의존한다.
기존의 테이블에서 학생 번호는 강좌 이름을 결정하고 강좌 이름은 수강료를 결정하고 있다.
그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다.
이행적 종속을 제거하는 이유는 비교적 간단한데 예를 들어 501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 하자
이행적 종속이 존재한다면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게된다.
강좌 이름에 맞게 수강료를 다시 변경해주면 되긴 하나 이러한 번거로움을 해결하기 위해 제 3 정규화를 하는 것이다.
즉, 다음과 같이 학생 번호를 통해 강좌 이름을 참조하고 강좌 이름으로 수강료를 참조하도록 테이블을 분해해야 한다.
참조
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 트랜잭션의 격리 수준 (0) | 2022.07.26 |
---|---|
[데이터베이스] 트랜잭션 (Transaction) (0) | 2022.07.22 |
[데이터베이스] Index (인덱스) (0) | 2022.07.22 |
[데이터베이스] Anomaly (이상 현상) (0) | 2022.07.22 |
[데이터베이스] EQUI JOIN vs Non-EQUI JOIN (등가 vs 비등가 조인) (0) | 2022.07.22 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!