데이터 베이스 정규화란?
데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정으로, 데이터의 중복을 제거하는 것이 목적이다.
중복을 제거함으로써, 효율성을 향상시키고 데이터 무결성을 보장할 수 있다.
정규화의 단계에는 1NF, 2NF, 3NF, BCNF(보이스-코드 정규화), 4NF, 5NF가 존재하지만, 여기서는 3NF까지만 다루고 있습니다.
이유는 3NF까지만 만족하더라도, 실무에서는 정규화 되었다고 말하기 때문입니다.
제 1 정규화(1NF)
제1 정규화를 만족하기 위해서는 다음 3가지의 조건을 만족해야한다.
- 테이블은 기본키를 가지는 것
- 반복되는 행이 존재하지 않는 것
- 컬럼에는 오직 단일 값만이 존재하는 것
위의 데이터를 보면 빨강색행이 완전히 중복하고 있기 때문에, 반복되는 행이 존재하지 않는 것
에 위배됩니다.
또한, 노랑색쉘 부분에는 하나의 컬럼에 단일 값이 아닌 복수의 값이 들어있기 때문에 컬럼에는 오직 단일 값만이 존재하는 것 에 위배됩니다.
위와같이 중복되는 행을 제거하고, 하나의 컬럼이 단일의 값을 가지도록 변경하면 1NF을 만족하게 됩니다.
제 2 정규화(1NF)
기본키가 복합키로 구성된 경우가 대상이 되고, 아래의 두가지의 조건을 만족해야합니다.
- 제1 정규화를 만족하는 것
- 모든 열은 기본키 전체에 의존하는 것
위의 데이터에서는, 이름과 과목 컬럼을 묶어서 기본키로 생성을 했고, 중복되는 행이 없으며 컬럼마다 단일 값을 가지고 있기 때문에 1NF을 만족하고 있습니다.
하지만, 점수 컬럼은 이름과 과목 컬럼에 모두 의존하고 있지만, 지역 컬럼은 과목 컬럼에는 의존하지 않고 이름 컬럼에만 의존하는 형태를 하고 있기 때문에 모든 열은 기본 키 전체에 의존하는 것
에 위배되게 됩니다.
위와 같이 두개의 테이블로 나누게 되면, 점수도 기본키(이름, 과목) 모두에 의존하게되고 지역도 기본키(이름)에 의존하게 되므로 2NF를 만족하게 됩니다.
제 3 정규화
- 제 2 정규화를 만족하는 것
- 기본키가 아닌 컬럼들은 기본키에 의존해야하는데 다른 일반 컬럼에도 의존하는 컬럼이 존재해서는 안된다.
기본키에도 의존하지만, 기본키가 아닌 일반 컬럼에도 의존하는 것을 이전적 함수 종속 관계
라고 합니다.
위의 테이블에는 기본키가 존재하고, 중복된 행이 없으며 단일 값을 가진 컬럼이므로 1NF를 만족하고, 담임과 담당과목 컬럼 모두 기본키 (학년, 반) 모두에 종속 되어 있으므로 2NF를 만족합니다.
하지만, 담당과목은 기본키에도 의존하지만 기본키가 아닌 담임 컬럼에도 의존하고 있기 때문에 3NF 정규화를 위배하고 있습니다.
위와같이 두 테이블로 분리하게 되면, 각 컬럼은 일반 컬럼에 의존하는 것이아니라 기본 컬럼에만 의존하기 때문에 3NF을 만족하게 됩니다.
맨 처음에 말했듯이, 정규화를 진행하게 되면 중복 데이터를 삭제하여 무결성을 보장하고, 데이터베이스의 저장공간을 효율적으로 사용할 수 있다. 또한, 쿼리 성능이 향상되어 효율성이 올라가게 된다.
하지만, 정규화는 위와같은 장점만 존재하는 것이 아닙니다.
테이블을 분리하기 때문에, 데이터 조회시에 조인을 유발하여 많은 자원을 사용하게 되고, 쿼리의 작성의 복잡성이 높아지게 됩니다.
이와같은 문제를 해결하기위해서, 반정규화를 수행하기도 합니다.
반정규화란?
데이터베이스 성능 향상을 위해서, 데이터의 중복을 허용하고 조인을 줄여 성능을 향상하는 방법
다음에는 반정규화에 대해서도 공부해서, 정리해보겠습니다.
'IT 공부 > DB' 카테고리의 다른 글
[ MySQL ]데이터베이스 문자열 함수 ( concat, substring, upper, lower) (0) | 2024.07.04 |
---|---|
[DB] 집계함수와 그룹핑(GROUP BY, HAVING) (0) | 2024.07.02 |
컬럼 수정하기 (제약조건, 컬럼명, 데이터 타입) (0) | 2024.06.24 |
[ DB ] LIKE 조건에 서브쿼리와 조인을 이용하는 방법 (0) | 2022.12.11 |
[ MySQL ] Auto_increment 초기화 && 기존 데이터 ID값 초기화 (0) | 2022.04.03 |