정규화 (DB Normalization)
- 하나의 엔티티에 많은 속성을 넣게 되면 해당 엔티티를 조회할 때마다 많은 양의 데이터가 조회됨
- 최소한의 데이터만을 하나의 엔티티에 넣는 식으로 데이터를 분해하는 과정
- 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 과정
- 데이터의 중복을 제거하고 데이터 모델의 독립성을 확보
- 데이터 이상현상을 줄이기 위한 데이터베이스 설계 기법
- 엔티티를 상세화하는 과정 ≫ 논리 데이터 모델링 수행 시점에서 고려됨
- 제 1 정규화부터 제 5 정규화까지 존재 ≫ 실질적으로는 제 3 정규화까지만 수행
이상현상 (Abnormality)
- 정규화를 하지 않아 발생하는 현상 (삽입이상, 갱신이상, 삭제이상)
- 삽입이상 : 특정 인스턴스가 삽입될 때 정의되지 않아도 될 속성까지도 반드시 입력되어야 하는 현상
- 예) 사원 + 부서 엔티티 (사원번호, 사원이름, 전화번호, 부서번호, 부서명, 부서위치) 속성 존재할 때 부서가 정해지지 않은 새로운 사원이 추가될 때 부서정보가 모두 임의값 또는 NULL 삽입되어야 함
- 부서가 새로 추가될 경우 소속 사원이 없어도 사원 관련 모든 속성에 불필요하게 값이 입력되어야 함
- 갱신이상
- 삭제이상
- 예) 부서 정보만 삭제하면 되는데 관련된 사원 정보까지 함께 삭제되는 현상
제 1 정규화 (1NF)
- 테이블이 컬럼의 원자성 (한 속성이 하나의 값을 갖는 특성)을 갖도록 테이블을 분해하는 단계
- 하나의 행과 컬럼의 갑시 반드시 한 값만 입력되도록 행을 분리하는 단계
- 예) 구매 테이블의 제 1 정규화 : 상품에 여러 값이 있으므로 이를 여러 인스턴스로 분해
제 2 정규화 (2NF)
- 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해
- 완전 함수 종속 ≫ 기본키를 구성하는 모든 컬럼의 값이 다른 컬럼을 결정짓는 상태
- 기본키의 부분 집합이 다른 컬럼과 1:1 대응 관계를 갖지 않는 상태를 의미
- PK가 2개 이상일 때 발생, PK의 일부와 종속되는 관계가 있다면 분리
예) 수강이력 테이블의 제 2 정규화
기본키 (학생번호 + 강의명) 중 강의명에 의해 강의실이 결정 ≫ 완전 함수 종속성 위배 (부분 함수 종속성)
PK와 부분 함수 종속성을 갖는 컬럼을 각각 다른 테이블로 분해!
- 수강이력에서는 한 학생이 여러 강의를 수강할 수 있기 때문에 주식별자는 학생번호로만은 불가능 (유일성 불만족 때문)
- 학생번호와 강의명이 결합되어 주식별자가 되어야 함 (한 학생이 같은 강의는 수강할 수 없다고 가정)
- 주식별자의 부분집합인 강의명에 의해 강의실이 달라지는 1:1 대응관계를 가짐 (부분 함수 종속 관계, 완전 함수 종속성 위배)
- 제 2 정규화는 이러한 부분 함수 종속성을 깨는 것을 목표로 함
- 주식별자를 분리할 수 없으니 주식별자는 수강이력에 그대로 있고, 문제가 되는 강의실 컬럼을 주식별자와 분리!
제 3 정규화 (3NF)
- 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리
- 이행적 종속성: A → B, B → C의 관계가 성립할 때 A → C가 성립되는 것
- (A, B)와 (B, C)로 분리하는 것 ≫ 제 3 정규화
예) 구매 테이블 제 3 정규화
고객번호에 의해 상품명이 결정, 상품명에 의해 가격이 결정
≫ 고객번호에 의해서도 구매 가격이 결정됨 (고객이 상품을 결정하면 그에 매칭되는 가격이 결정되는 구조)
≫ (고객번호 + 상품명) / (상품명 + 가격)으로 분리하는 것이 제 3 정규화
- 이 경우 테이블을 분리하지 않으면, 구매 테이블에서 상품명을 변경해야 하는 상황이 발생할 경우 그 때마다 구매 테이블에서 가격도 변경해야 함
- 제 3 정규화를 진행하여 분리하면 구매 테이블에서의 상품명만 변경하면 됨
- 업데이트의 비효율성이 줄어든다!
예) 계좌번호 제 3 정규화
- 예수금은 관계 없으므로 두고 관리점 코드를 테이블로 따로 분리
BCNF (Boyce-Codd Normal Form) 정규화
- 모든 결정자가 후보키가 되도록 테이블을 분해하는 것 (결정자가 후보키가 아닌 다른 컬럼에 종속되면 안 됨)
제 4 정규화
- 여러 컬럼들이 하나의 컬럼을 종속시키는 경우 분해하여 다중값 종속성을 제거
제 5 정규화
- 조인에 의해서 종속성이 발생되는 경우 분해
반정규화, 역정규화 (De-Normalization)의 개념
- 데이터베이스의 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법
- 조회 (SELECT) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아짐
- 비정규화는 정규화를 수행하지 않음을 의미
반정규화 수행 케이스
- 정규화에 충실하여 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우
- 다량의 범위를 자주 처리해야 하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우
'sqld' 카테고리의 다른 글
1-8) 모델이 표현하는 트랜잭션의 이해 (0) | 2024.08.19 |
---|---|
1-7) 관계와 조인의 이해 (0) | 2024.08.19 |
1-5) 식별자 (0) | 2024.08.08 |
1-4) 관계(Relationship) (0) | 2024.07.29 |
1-3) 속성(Attribute) (0) | 2024.07.28 |