mojo's Blog

Normalization 본문

Computer Science/데이터베이스

Normalization

_mojo_ 2022. 1. 21. 00:49

정규화 (Normalization)

 

※ Normalization

데이터베이스의 가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것이다.

중복된 데이터를 만들지 않으면 무결성을 유지할 수 있으며 DB 저장 용량 또한 효율적으로 관리할 수 있다.

 

무결성은 무엇인가요?

데이터 무결성이란 컴퓨팅 분야에서 완전한 수명 주기를 거치며 데이터의 정확성과 일관성을 유지하고 보증하는 것을 가리키며 데이터베이스나 RDBMS 시스템의 중요한 기능이다.

 

 

※ Normalization의 목적

  • 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
  • 무결성을 지키고 이상 현상을 방지한다.
  • 테이블 구성을 논리적이고 직관적으로 할 수 있다.
  • 데이터베이스 구조를 확장에 용이해진다.

 

① 제 1정규화(1NF)

테이블 칼럼이 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것을 말한다.

만족해야 할 조건은 다음과 같다.

  • 어떤 릴레이션에 속한 모든 도메인이 원자값만으로 되어 있어야 한다.
  • 모든 속성에 반복되는 그룹이 나타나지 않는다.
  • 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.

 

 

왼쪽의 고객 테이블에 핸드폰 번호를 여러개 가지고 있어서 원자값이라고 할 수 없다.

1NF을 충족시키기 위해서는 오른쪽과 같이 분리 해야 한다.

 

 

② 제 2정규화(2NF)

테이블의 모든 칼럼이 "완전 함수적 종속"을 만족해야 한다.

테이블에서 기본키가 복합키(key1, key2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 칼럼을 결정지을 수 있으면 안된다. (즉, 기본키의 부분집합 키가 결정자가 되어선 안된다는 것!)

 

 

핸드폰, 고객 ID가 키가 되어 고객의 이름을 알 수 있다.

핸드폰은 핸드폰 번호로 인해 결정된다. (부분 함수 종속)

따라서 고객과 핸드폰은 아무런 연관관계가 없는 상황이다.

결국 완전 함수적 종속을 충족시키지 못하고 있는 테이블이므로 부분 함수 종속을 해결하기 위해 테이블을 오른쪽과 같이 나눠서 2NF를 만족시킬 수 있다.

 

 

③ 제 3정규화(3NF)

2NF가 진행된 테이블에서 "이행적 종속"을 없애기 위해 테이블을 분리하는 것이다. 

 

이행적 종속이란?

 

이행적 종속은 A → B 이고 B → C 이면 A → C 가 성립하는 것을 의미한다.

 

제 3정규화는 아래의 두가지 조건을 만족시켜야 한다.

  • 릴레이션이 2NF에 만족한다.
  • 기본키가 아닌 속성들은 기본키에 의존한다.

 

 

왼쪽의 경기 우승자 테이블에서 경기와 연도는 기본키이다.

우승자는 이 두 복합키(경기, 연도)를 통해 결정된다.

하지만 우승자 성별은 기본키가 아닌 우승자에 의해 결정되므로 이는 3NF를 위반하고 있기 때문에 오른쪽과 같이 분리해야 한다.

 

 

④ BCNF(Boyce-Codd) 정규형

여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다.

복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 3 정규형을 보완하는데 의미가 있다.

비주요 애트리뷰트가 후보키의 일부를 결정하는 분해하는 과정을 말한다.

 

각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖는다.

 

  • 모든 제 2 정규형 릴레이션은 제 1 정규형을 갖는다.
  • 모든 제 3 정규형 릴레이션은 제 2 정규형을 갖는다.
  • 모든 BCNF 정규형 릴레이션은 제 3 정규형을 갖는다.

 

수많은 정규형이 있지만 관계 데이터베이스 설계의 목표는 각 릴레이션이 3NF(or BCNF)를 갖게 하는 것이다.

 

 

※ 정규형 장점

  • 데이터베이스 변경 시 이상 현상을 제거
  • 사용자에게 데이터 모델을 더욱 의미있게 제공한다.

 

※ 정규형 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다. (응답 시간 저하)
  • 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.

 

※ 정규화 단점의 대응책

조회를 하눈 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.

 

반정규화(De-normalization) 란?

 

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.

디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다.

일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

 

반정규화의 대상은 다음과 같다.

  • 자주 사용되는 테이블에 엑세스하는 프로세스의 수가 가장 많고 항상 일정한 범위만을 조회하는 경우
  • 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
  • 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

 

반정규화 과정에서 주의할 점은 반정규화를 과도하게 적용하다 보면 데이터 무결성이 깨질 수 있다.

또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.

 

 

참고 : gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖 (github.com)

 

GitHub - gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖

👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub.

github.com

 

'Computer Science > 데이터베이스' 카테고리의 다른 글

Anomaly, Index  (0) 2022.03.02
데이터베이스  (0) 2022.03.02
Redis  (0) 2022.03.01
Transaction  (0) 2022.02.28
SQL injection / SQL vs NoSQL  (0) 2022.01.20
Comments