코딩하는 오징어

데이터 모델링의 정규화 본문

알쓸신잡

데이터 모델링의 정규화

코딩하는 오징어 2020. 1. 5. 15:30
반응형

정규화란?

  • 데이터 모델 설계시 중복을 최소화하도록 데이터를 구조화하는 작업
  • 하나의 종속성이 하나의 표(관계형 이론에서의 Relation)로 관리되도록 분해해가는 과정
  • 종속성을 기준으로 데이터를 어떻게 담는 것이 최적인가에 대한 방법론

기본적으로 높은 차수의 정규형은 낮은 차수의 정규형을 모두 만족하여야 한다. 즉, 제3정규형은 제1,2 정규형의 조건을 모두 만족하여야 하며, BCNF는 1,2,3 정규형을 기본적으로 모두 만족하고 있어야 한다.

제1 정규형

  • 컬럼은 원자성을 유지해야한다. ( 모든 속성이 값을 반드시 하나만 가져야한다. )
ID Name Phone Number
1 코딩하는 오징어 010-1111-1111
  • 위와 같이 모델링 할 경우 Phone Number 컬럼은 원자성을 유지하지 못한다. 사용자가 여러 핸드폰 번호를 가질 경우 문제가 발생한다. 하나의 컬럼에 010-1111-1111, 010-111-1112 와 같이 데이터를 저장한다면 원자성이 깨진다. 이를 제거하기 위해 다음과 같이 모델링한다.
ID Name
1 코딩하는 오징어
ID UserID PhoneNumber
1 1 010-1111-1111
2 1 010-1111-1112

제2 정규형

  • 부분 함수적 종속관계를 제거해야한다. 즉, 모든 속성이 반드시 주 식별자 전부에 종속되어야 한다.

함수 종속: 하나의 집합안에 존재하는 속성 사이의 연관관계
집합 내 속성 A가 속성 B의 값을 유일하게 식별하는 결정자라면 속성 B는 속성 A에 함수적으로 종속된다.

 

1정규화로 생성된 집합은 자식이 되지만, 2정규화로 분리된 집합은 부모가 된다.

 

Developer Tech PhoneNumber
코딩하는 오징어 Kotlin 010-1111-1111
코딩하는 오징어 JPA 010-1111-1111
코딩하는 오징어 Spring 010-1111-1111
Hubert Mysql 010-1111-1112
Hubert Scala 010-1111-1112
  • 위 테이블에서 (Developer, Tech)는 후보키가 될 수 있다. 하지만 핸드폰 번호는 Developer에만 종속적인 관계를 갖는다. 이처럼 키의 일부에만 종속적인 관계를 가지는 것을 부분 함수적 종속관계라 하며, 부분 함수적 종속 관계는 갱신이상 현상을 초래할 수 있다.
Developer PhoneNumber
코딩하는 오징어 010-1111-1111
Hubert 010-1111-1112
Developer Tech
코딩하는 오징어 Kotlin
코딩하는 오징어 JPA
코딩하는 오징어 Spring
Hubert Mysql
Hubert Scala
  • 위와 같이 테이블을 분리하면 2차 정규형을 만족하게 된다.

제3 정규형

  • 이행 함수적 종속 (x -> y ->z) 제거한다. 즉, 주 식별자가 아닌 모든 속성이 상호 종속 관계여서는 안된다.
대회 연도 우승자 우승자 생년 월일
Linux Master 2018 Hubert 1994.11.28
Linux Master 2017 코딩하는 오징어 1994.05.05
JVM 2012 컴퓨터 1994.11.01
  • 위 테이블에서 대회 + 연도를 키로 우승자가 결정되고 우승자에 따라 우승자 생년월일이 결정된다. 이처럼 x->y 이고 y-> z 인 관계를 이행 함수적 종속이라고 한다. 이런 경우 우승자를 변경하면 불필요하게 우승자 생년월일도 동시에 변경해야 하기 때문에 갱신이상 현상을 초래할 수 있다. 이를 해결하려면, 다음과 같이 테이블을 분리해야한다.
대회 연도 우승자
Linux Master 2018 Hubert
Linux Master 2017 코딩하는 오징어
JVM 2012 컴퓨터
우승자 우승자 생년 월일
Hubert 1994.11.28
코딩하는 오징어 1994.05.05
JVM 1994.11.01

대부분의 99%의 정규형 작업이 여기서 끝난다. 따라서 정규화는 제3 정규형까지만 정리하는 것으로 마무리한다.

 

반응형

'알쓸신잡' 카테고리의 다른 글

OLTP와 OLAP  (1) 2020.01.05
데이터 모델링에서 정규화의 의의와 성능 논쟁  (0) 2020.01.05
Timeout에 관한 정리  (0) 2019.03.19
HikariCP 세팅시 옵션 설명  (0) 2018.10.02
Gradle 빌드시스템 기초  (2) 2018.08.25
Comments