정규화(Normalization)
데이터의 중복을 줄이고, 무결성을 향상시킬 수 있는 정규화에 대해 알아보자.
가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것이다.
중복된 데이터를 만들지 않으면 무결성을 유지할 수 있고, DB 저장 용량 또한 효율적으로 관리할 수 있다.
목적
- 데이터의 중복을 없애면서 불필요한 데이터를 최소화 시킨다.
- 무결성을 지키고, 이상 현상을 방지한다.
- 테이블 구성을 논리적이고 직관적으로 할 수 있다.
- 데이터베이스 구조를 확장에 용이하게 설계할 수 있다.
정규화에는 여러가지 단계가 있지만, 대체적으로 1 ~ 3 단계 정규화 까지의 과정을 거친다.
제 1 정규화(1NF)
테이블 컬럼이 원자값(하나의 값) 을 갖도록 테이블을 분리시키는 것을 말한다.
만족해야 할 조건은 아래와 같다.
- 어떤 릴레이션에 속한 모든 도메인이 원자값으로만 되어 있어야 한다.
- 모든 속성에 반복되는 그룹이 나타나지 않는다.
- 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.
위의 고객 테이블은 한 고객이 전화번호를 여러개 가지고 있어 원자값이라고 볼 수 없다. 따라서 1NF 에 맞추기 위해서는 아래와 같이 분리할 수 있다.
제 2 정규화(2NF)
테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 한다.
조금 쉽게 말하자면, 테이블에서 기본 키가 복합 키(키1, 키2)로 묶여있을 때, 두 키중 하나의 키만으로 다른 컬럼을 결정 지을 수 있으면 안된다.
- 기본키의 부분집합 키가 결정자가 되어선 안된다는 것
Manufacture 과 Model 이 키가 되어 Model Full Name 을 알 수 있다.
Manufacture Country 는 Manufacture 로 인해 결정된다.(부분 함수 종속)
따라서, Model 과 Manufacture Country 는 아무런 연관관계가 없는 상황이다.
결국 완전 함수적 종속을 충족시키지 못하고 있는 테이블이다.
부분 함수 종속을 해결하기 위해 테이블을 아래와 같이 나눠서 2NF 를 만족할 수 있다.
Electric Toothbrush Models 테이블에서는 참조해온 외래 키인 Manufacturer 와 Model 속성을 합쳐 (Manufacturer, Model) 로 기본키를 구성하였다.
이를 통해 해당 기본 키로 Model Full Name 을 구분할 수 있게 되었다.
제 3 정규화(3NF)
2NF 가 진행된 테이블에서 이행적 종속을 없애기 위해 테이블을 분리하는 것이다.
- 이행적 종속 : A -> B, B -> C 이면 A -> C 가 성립된다.
아래 두 가지 조건을 만족시켜야 한다.
- 릴레이션이 2NF 에 만족한다.
- 기본키가 아닌 속성들은 기본키에 의존한다.
위의 테이블에서는 Tournament 와 Year 이 기본키이다.
Winner 는 이 두 복합키를 통해 결정된다.
하지만 Winner Date of Birth 는 기본키가 아닌 Winner 에 의해 결정되고 있다.
따라서 이는 3NF 를 위반하고 있으므로 아래와 같이 분리해야 한다.
솔직히 당장 위의 테이블을 봤을 때는 저렇게 구성을 해도 딱히 오류가 생기거나 하지는 않겠지만, 오류가 생기지 않더라도 정규화를 수행함 으로서 데이터베이스의 구조를 쉽게 확장 시킬 수 있도록 설계해 줄 수 있기 때문에 3 정규화 또한 꼭 필요한 작업이라고 볼 수 있겠다.
Date of Birth 속성을 결정짓는 Winner 속성을 기본키로 가지는 테이블을 하나 더 만드는 것으로 기존의 테이블을 분리 하렸다.
여기서 Tournament Winners 테이블은 Winner Dates of Birth 테이블의 기본키인 Winner 속성을 외래 키 값으로 가진다.
참고 : https://gyoogle.dev/blog/
👨🏻💻 Tech Interview
gyoogle.dev
'이론 > 데이터베이스' 카테고리의 다른 글
DB - 트랜잭션(Transaction) (0) | 2022.01.29 |
---|---|
DB - 인덱스(Index) (0) | 2022.01.28 |
DB - 이상(Anomaly) (0) | 2022.01.28 |
DB - SQL vs NOSQL (0) | 2022.01.28 |
DB - Join (0) | 2022.01.28 |