Home 제1절 - 정규화
Post
Cancel

제1절 - 정규화

데이터 모델링에서 정규화Normalization
가장 기초적이지만 필수적으로 이뤄져야 하는 작업.
(성능을 위해 반정규화 하기도 함)


1. 제1정규형

모든 속성은 반드시 하나의 값을 가져야 한다.

1.1. 다중 값multivalued

  연락처 속성에 다중값 들어가는 경우

IE 표기법


바커 표기법


고객번호고객명연락처
10000정우진02-123-4567,010-1234-5678
10001한형식010-5678-2345
10002황영은02-345-3456,010-4567-7890

발생하는 문제
 - 연락처 정보에서 집전화와 핸드폰 번호 구별 어려움
 - 집전화가 여러 대이거나, 핸드폰이 여러 대라면 원하는 속성 값 추출 어려움
 - 명확치 않은 속성은 이메일같은 다른 유형 데이터 포함 가능성 존재

  => 개발 복잡성 증가, 연락처 속성의 의미 퇴색
  ==> 장기적으로 불안정 데이터 구조 양산

고객번호고객명
10000정우진
10001한형식
10002황영은
[고객]
고객번호순번연락처
10000102-123-4567
100002010-1234-5678
100011010-5678-2345
10002102-345-3456
100022010-4567-7890
[고객 연락처]

위와 같이 하면,
고객 연락처가 많아져도 문제 X
집전화 OR 핸드폰 번호 구분하고 싶다면
  => 고객연락처 엔터티에 ‘연락처구분코드’ 속성 추가

1.2. 다른 유형의 중복 데이터

우려되는 점
 - 상품을 3개 이상 주문 불가
  : 즉, 3개 이상 상품 주문하는 경우는 ‘상품번호N, 상품명N’의 속성 매번 추가
  => 속성 추가한다는 것은 table의 column 추가하는 것
  => table Lock 발생, 경우에 따라 사이트 중지도 필요

 - 상품1, 상품2 모두 빠르게 조회 원한다면
  => 속성마다 index 추가해야 함.
  (반면, 인덱스 추가하면,
  조회SELECT 속도는 빨라져도 입력·수정·삭제 속도는 느려짐!!)

주문상세 엔터티 추가


2. 제2정규형

엔터티의 일반속성은 주식별자 전체에 종속적이어야 한다.

‘상품명’ 속성이 주식별자가 아니라 오직 상품번호에 대해서만 반복, 쌓이는 구조

주문번호상품번호상품명
1100001256SQL
1100002257DA
1100003256SQL
1100004256SQL
1100005258DA
[주문상세]

상품번호는 주문 시 발생하는 매핑 정보로서 의미 가짐 => 중복된 데이터 X
But, 상품명은 오직 상품번호에 의해서만 결정
      (“종속적”)

함수종속성Functional Dependency
 : 데이터들이 어떤 기준값에 의해 종속되는 현상

함수종속성
결정자
(Determinant)
---->종속자
(Dependent)
상품번호---->상품명
[함수의 종속성]

상품명: 상품번호에 종속되어 있음
  ==> 종속자
상품번호: 상품명을 결정함
  ==> 결정자

주문상세 엔터티의 상품명은 식별자 전체가 아닌 일부에만 종속적
 ==> 부분 종속Partial Dependency
 ==> 제2정규형에 위배

문제점
 - 상품명 변경이 업무적 반영 필요하다면,
  주문상세의 중복된 상품명을 모두 변경해야 함.
많이 팔린 상품일수록 변경해야 할 상품명 부하도 크게 증가!
 - 주문상세의 상품명 변경하더라도 특정 시점엔 미변경 상품명 존재
  이때 들어온 트랜잭션은 비일관 데이터 조회하게 됨!

상품 엔터티 추가  : 상품명 속성을 상품 엔터티에서 관리, 상품번호를 매핑키로 활용
  ==> 주문상세 엔터티의 부분 종속성 제거 가능.

조인Join
기존 주문상세 엔터티에서 상품 엔터티 분리하여 상품정보 관리하도록 함.
 ==> 주문상세 엔터티에선 상품번호만 존재,
   상품번호 매핑키로 상품 엔터티에서 원하는 상품 데이터 조회 가능.


3. 제3정규형

엔터티의 일반속성 간에는 서로 종속적이지 않는다.

고객번호는 주문번호에 종속적,
고객명은 고객번호에 종속적.
  ==> 고객명이 주문번호에 종속적
    (이행적 종속Transitive Dependency)

이러한 이행적 종속을 배제하는 게 제3정규형.

주문번호 -> 고객번호
--->주문번호 -> 고객명
고객번호 -> 고객명

즉, 고객명이 식별자가 아닌 일반속성에 종속적
 ==> 제3정규형 위배


4. 반정규화와 성능

반정규화?
: 성능 위해 데이터 중복 허용


Contents