나의 길
데이터베이스 정규화 알아보기✅ 본문
데이터베이스 정규화란?
데이터 구조를 최적화하여 데이터의 중복을 최소화하기 위한 프로세스
정규화의 장점
- 이상 현상 방지(삽입 이상, 갱신 이상, 삭제 이상)
- 유지 보수의 용이(변경과 확장)
- 성능 향상(쿼리) 및 비용 감소(효율적인 저장)
💬 이상 현상
삽입 이상 : 정규화 되지 않은 테이블에 데이터를 삽입하기 불필요한 데이터를 삽입해야되는 경우.
갱신 이상 : 동일한 값이 여러 곳에 저장되어 있어 모든 값이 갱신되지 않아 데이터의 불일치가 발생하는 경우.
삭제 이상 : 특정 데이터를 삭제하면 원하지 않는 다른 데이터도 함께 삭제되는 경우.
정규화 단계
제 1정규화(1NF : First Normal Form)
- 테이블의 속성 값이 원자값을 가져야한다.
회원이름 | 구매 상품 |
호두 | 육포 |
나무 | 츄르 |
럭키 | 육포, 츄르 |
킹 | 츄르, 캣닙 |
- 회원구매상품들 -
위 테이블은 제 1정규형을 만족하지 못한다. 그 이유는 구매 물품 속성 값이 원자값으로 이루어져 있지 않기 때문이다.
위와 같은 테이블을 정규화하면 아래와 같은 테이블로 나타낼 수 있습니다.
회원이름 | 상품명 |
호두 | 육포 |
나무 | 츄르 |
럭키 | 육포 |
럭키 | 츄르 |
킹 | 츄르 |
킹 | 캣닙 |
- 회원 상품 구매 -
이렇게 속성 값을 원자로 만드는 이유는 개발을 할 때 값을 select해 이용하게 된다. 그런데 제 1정규화가 되지 않는 속성 값으로 데이터를 가져온다면 사용 시 쿼리로 원하는 값만 가져오거나 모두 가져온 값에서 원하는 값을 걸러내는 작업을 추가로 해야 한다. 그리고 수정과 삭제를 할때도 번거로워진다.
제 2정규화(2NF : Second Normal Form)
- 제 1정규형을 만족하고, 부분 함수 종속성(partial dependency)을 제거한다.
회원번호 | 회원이름 | 상품명 | 상품 가격 |
1 | 호두 | 육포 | 5000 |
2 | 나무 | 츄르 | 3000 |
3 | 럭키 | 육포 | 5000 |
3 | 럭키 | 츄르 | 3000 |
4 | 킹 | 츄르 | 3000 |
4 | 킹 | 캣닙 | 2000 |
- 회원 상품 구매 -
위의 테이블은 제 1정규화를 마친 테이블에 회원번호와 상품 가격 속성을 추가한 테이블입니다.
여기서 부분 함수 종속을 제거하기 위해 생각해보겠습니다. 부분 함수 종속이란 기본키가 복합키(Composite primary key)일 경우 발생하는 종속성입니다. 위의 테이블에서는 회원번호와 상품명 속성이 복합키입니다.
해당 복합키를 살펴보면 회원이름은 복합키의 일부인 회원번호에만 종속적이고, 상품 가격도 복합키 중 상품명에만 종속적입니다. 이와 같은 부분 함수 종속을 제거하지 않으면 수정과 같은 작업 시 이상 현상을 야기할 수 있습니다.
회원번호 | 회원명 |
1 | 호두 |
2 | 나무 |
3 | 럭키 |
4 | 킹 |
- 회원 -
상품명 | 상품 가격 |
육포 | 5000 |
츄르 | 3000 |
캣닙 | 2000 |
- 상품 -
회원번호 | 상품명 |
1 | 육포 |
2 | 츄르 |
3 | 육포 |
3 | 츄르 |
4 | 츄르 |
4 | 캣닙 |
- 구매 -
위 세개의 테이블은 제 2정규화를 통해 구매 상품의 가격이 수정되면 한 번의 수정만으로 가격을 변경할 수 있습니다.
(이전 테이블은 육포의 가격이 수정되면 고객번호 1, 3의 상품 가격을 다 변경해줘야 했다.)
제 3정규화(3NF : Third Normal Form)
- 제 2정규형을 만족하고, 이행적 함수 종속성을 제거한다.
상품코드 | 상품명 | 상품 가격 | 카테고리 | 카테고리 설명 |
1 | 육포 | 5000 | 가공음식 | 조리가 편하도록 가공 처리한 식품 |
2 | 츄르 | 3000 | 사료 | 반려동물이 먹는 음식 |
3 | 캣닙 | 2000 | 반려동물 용품 | 반려동물이 사용하는 용품 |
4 | 사료 | 4000 | 사료 | 반려동물이 먹는 음식 |
- 상품 -
해당 테이블은 상품 테이블로 제 2정규화는 만족하지만 이행적 함수 종속성을 가지고 있습니다.
이행적 함수 종속성은 기본키가 아닌 속성이 다른 기본키가 아닌 속성에 종속되는 것을 말합니다. 간단한 식으로 표현하자면 A(기본키)를 알면 B(비기본키)를 알게되고, B(비기본키)를 알면 C(비기본키)를 알게 되는 경우를 말합니다.
여기서 기본키인 상품명을 알게되면 카테고리를 알게되고 카테고리를 알게되면 카테고리 설명을 알게 됩니다. 카테고리 설명은 카테고리에 종속적이기 때문에 제 3정규화를 진행해야 합니다.
상품코드 | 상품명 | 상품 가격 | 카테고리 |
1 | 육포 | 5000 | 가공음식 |
2 | 츄르 | 3000 | 사료 |
3 | 캣닙 | 2000 | 반려동물 용품 |
4 | 사료 | 4000 | 사료 |
- 상품 -
카테고리 | 카테고리 설명 |
가공음식 | 조리가 편하도록 가공 처리한 식품 |
사료 | 반려동물이 먹는 음식 |
반려동물 용품 | 반려동물이 사용하는 용품 |
- 카테고리 -
위 테이블은 제 3정규화를 진행한 테이블입니다.
BCNF(Boyce-Codd Normal Form)
- 제 3정규형을 만족하고, 모든 결정자가 후보키 집합에 속해야 한다.
학생ID | 과목 | 지도 교수명 |
1 | 자료구조 | jo |
2 | 자료구조 | park |
1 | 데이터베이스 | lee |
3 | 자료구조 | jo |
해당 테이블은 제 3정규형은 만족하지만, BCNF는 만족하지 않는 테이블의 예시입니다.
결정자란 속성 A를 통해 B속성을 결정한다면 A 속성을 결정자라고 합니다. 후보키는 테이블의 행을 고유하게 식별할 수 있는 속성입니다.(기본키도 후보키)
학생ID | 지도 교수명 |
1 | jo |
2 | park |
1 | lee |
3 | jo |
지도교수 | 과목 |
jo | 자료구조 |
park | 자료구조 |
lee |
데이터베이스 |
제 4정규화(4NF : Fourth Normal Form)
- BCNF를 만족하고, 다치 종속(Multivalued Dependency)을 제거한다.
제 5정규화(5NF : Fifth Normal Form)
- 제 4정규화를 만족하고, 조인 종속(Join Dependency)을 제거한다.
끝으로
💬 정규화는 꼭 모든 단계까지 고려하여 설계해야 할까?
일반적으로는 제 3정규화, BCNF까지 수행합니다. 이유는 해당 단계까지 정규화를 하면 일반적인 경우 대부분의 데이터 중복과 이상 현상이 제거되기 때문입니다. 그리고 너무 높은 수준의 정규화는 데이터베이스 성능에 부정적인 영향을 미치게 되고, 테이블이 너무 많이 분할되어 관리에 어려움이 있습니다.
'DB' 카테고리의 다른 글
docker container 기반의 mariaDB Galera Cluster(1) (0) | 2023.07.16 |
---|---|
SQL 기초 2 (0) | 2022.06.27 |
메타데이터(METADATA), 인덱스(INDEX), 뷰(VIEW) 알아보기 (0) | 2022.06.23 |
DB(데이터베이스) 이해 (0) | 2022.06.08 |
★DB 기초 SQL (0) | 2022.05.24 |