h1.02. 정규화 이야기

h3.2.1 정규화에 대한 서설(序說)

정규화(Normalization)는 모델링의 꽃

  • 정규화를 꼭 해야 하는가? 모델러라면 정규화를 꼭 해야 하며, 데이터 모델을 제대로 설계하기 위한 근본적인 해결책은 정규화뿐이다.
  • 정규화에 대한 훈련은 속성의 종속성을 파악해서 엔터티를 설계하는 훈련으로, 핵심은 식별자(Identifier)종속성(Dependency) 이다.
  • 정규화는 일반적으로 순서대로 수행하지 않지만, 순서대로 수행하는 것이 더 체계적일 수는 있다.
  • 정규화는 업무 요건에 종속돼 있으므로 정규화를 하려면 업무 요건을 완전히 이해해야 한다.
  • 정규화를 수행할 때 사례 와 반례 데이터를 활용하는 것이 좋다.

h3.2.2 정규화(Normalization)의 정의

정규화

식별자에 종속된 유사한 속성들은 모으고, 종속되지 않은 독립적인 속성들은 분리하여 속성을 명확히 구별하는 것

  • 정규형(Normal Form) 모델
    • 정규화 과정은 속성의 종속성과 의존성을 분석해 더는 분해(Decomposition)될 수 없는 정규형 엔터티를 만드는 것이다.
    • 정규화 과정을 거친 모델을 정규형 모델이라고 한다.
    • 완전한 정규형 모델은 업무 요건 을 완전히 이해하고 설계한 모델이다.
  • 정규화와 성능
    {info:title=더 이상 추가할 속성이 없는 모델보다, 제거할 속성이 없는 모델이 완벽한 모델이다.}
    {info}
    • 정규화를 하면 엔터티는 분해되고 중복 속성은 제거되기 때문에 데이터를 추출할 때 성능이 떨어질 수 있다.
    • 정규화를 수행할 때는 성능을 고려해야 하며, 성능 문제가 분명할 때는 비정규화를 고려해야 한다.

h3.2.3 함수 종속(Functional Dependency:FD)

함수 종속

어떤 집합이든 그 집합을 대표하는 속성(식별자 또는 후보 식별자)이 존재하는데, 이 대표 속성과 나머지 속성 사이의 연관 관계이다.
: 릴레이션에서 A 속성의 값이 B 속성의 값을 유일하게 식별할 수 있다면, B 속성은 A 속성에 함수적으로 종속됐다고 한다. (A → B)

  • 릴레이션 내에 존재하는 속성 간의 종속성을 의미한다.
  • 한 속성의 값을 알면 다른 속성의 값은 저절로 결정되는, 두 속성 간의 일종의 제약(Constraint)이다.
  • 속성 간의 종속성을 분석해 집합을 분리하기 위한 것이다.
  • 속성 간의 종속성 파악은 속성의 의미업무 요건 를 정확히 이해해야 한다.
  • 정규화를 수행하는 도구이자, 검증의 도구이다.

h3.2.4 결정자(Determinant)와 종속자(Dependent)

결정자

  • 결정자: 속성 간의 종속성을 분석할 때 기준이 되는 값, 식별자 속성
  • 종속자: 결정자의 값에 의해 정해질 수 있는 값, 비식별자 속성
  • X의 값에 대해 Y의 값이 오직 하나만 연관돼 있을 때, 이를 "속성 Y가 속성 X의 함수적 종속이다."라고 한다: X → Y 또는 y=f( x)
  • X: 결정자, Y: 종속자
  • 함수종속과 엔터티 설계
    • FD1:주문번호 → 주문일자
    • FD2:주문번호 → 고객번호
    • FD3:주문번호 → 상품번호
    • FD4:고객번호 → 고객명
    • FD5:상품번호 → 상품명
    • FD6: 주문번호 → (주문일자, 고객번호, 상품번호)
    • 엔터티1: #주문번호, 주문일자, 고객번호, 상품번호
    • 엔터티2: #고객번호, 고객명
    • 엔터티3: #상품번호, 상품명
  • 이행 종속(Transitive Dependency: X → Y → Z)
    • 이행 종속인 속성 X, Y, Z를 하나의 엔터티가 아닌 직접 종속인 X와 Y를 하나의 엔터티로, 그리고 Y와 Z를 다른 엔터티로 설계해야 한다.
    • 함수 종속은 일반적으로 직접 종속을 의미한다.

h3.2.5 함수 종속과 폐포(Closure)

폐포( X ^+^ )

한 속성(X)에 종속됐다고 추론(Reasioning)할 수 있는 모든 속성의 집합: X → (Y, Z) 라면 X =X, Y, Z

  • 폐포와 릴레이션 R의 키(Key) 도출
    • R { A, B, C, D, E }
    • A → C
    • B → D
    • A, B → E
    • A = A, C
    • B = B, D
    • (A, B) = A, B, C, D, E
    • 위와 같이 (A, B) 가 릴레이션 R의 전체 속성을 포함하고 있으므로 릴레이션 R의 키는 A와 B 속성이 된다.
  • 다음 종속성 추론 규칙을 이용하여 폐포를 구할 수 있다.
    • Y ⊆ X 이면 X → Y 이 성립한다.
    • X → Y 이면 XZ → YZ 이 성립한다.
    • X → Y 이고 Y → Z 이면 XZ → YZ 이 성립한다.
    • X → YZ 이면 X → Y 이고 X → Z 이 성립한다.
    • X → Y 이고 X → Z 이면 X → YZ 이 성립한다.
    • X → Y 이고 YZ → W 이면 XZ → W 이 성립한다.
  • 폐포 활용
    • 실무에서 폐포를 구해서 엔터티를 설계하는 경우는 거의 없지만, 만약 식별자가 명확하지 않다면 폐포를 설계해볼 수 있다.
    • 폐포는 식별자가 정확한지를 검증하는 도구로 사용할 수 있다.

h3.2.6 함수 종속과 정규화

함수 종속성을 분석하는 것이 곧 정규화다.

함수 종속에 의해 유사한 속성끼리 모아서 하나의 릴레이션으로 만드는 체계적인 방법이 정규화다.

  • 정규화 수행 방법
    • 릴레이션의 키 도출
    • 릴레이션에 존재하는 모든 함수 종속을 구하는 것
      ※ 어떤 방법이든 키를 구하는 것으로 시작하며, 키를 구하려면 모든 함수 종속을 찾아야 하기 때문에 결국 같은 방법이다.
  • 모델링 방법에 따른 정규화 수행 방법
    • 상향식 모델링 방법 (현행 엔터티가 존재 시): 기존 엔터티의 주 식별자를 검증하면서 정규화를 수행한다.
    • 하향식 모델링 방법 (현행 엔터티가 미존재 시): 후보 식별자를 찾고, 함수 종속을 찾으면서 식별자를 정제해 나가면서 정규화를 수행한다.

h3.2.7 그냥 릴레이션(NFNF: Non First Normal Form, NF 2)과 비(非)정규형 릴레이션

그냥 릴레이션

  • 그냥 릴레이션: 정규화 과정을 거치지 않은 릴레이션
  • 비정규형 릴레이션: 정규형이 아닌 릴레이션
  • 그냥 릴레이션
!그림2-1.PNGalign=left!
  • 정규형 릴레이션
!그림2-2.PNGalign=left!
    • 그림2.1 그냥 릴레이션에서 주 식별자가 계좌번호이기 때문에 고객과 연관된 속성을 제거하였다.
  • 비정규형 릴레이션
!그림2-3.PNGalign=left!
    • 정규화 과정을 거친 그림2.2 정규형 릴레이션에 고객 속성을 중복 속성으로 추가한 릴레이션이다.
    • 정규형 릴레이션으로 설계한 후, 성능 문제 등의 이유가 있을 때 비정규형 릴레이션을 설계할 수 있다.
    • 반드시 비정규형 릴레이션은 정규형화 과정을 거쳐야 한다.

h3.2.8 등산과 정규화

정규형은 산의 정상과 같다.

  • 등산: 정규화
  • 하산: 비정규화
  • 완전한 정규형 모델을 구축하려면 많은 노력이 든다.
  • 정규화 과정을 통해 데이터를 완전히 이해한 상태에서 비정규화 수행은 많은 노력이 들지 않는다.
  • 등산의 목적이 산 정상에 올라가는 것과 같이, 모델러라면 반드시 정규화를 수행해야 한다.

h3.2.9 정규화의 이(利)점

  • 데이터의 완전성(Completeness)을 지킬 수 있다.
    • 정규화로 중복 데이터를 제거하므로서 데이터 정합성이 향상된다.
    • 중복 속성의 사용
      • 그럼2.4에서 엔터티 장바구니, 관심상품, 주문상품, 상품에 중복으로 상품명 속성이 존재한다.
      • 만약 상품명이 바뀌면 모든 엔터티의 상품명 속성 값을 수정해야 한다.
      • 중복 데이터는 여러 군데 쓰일수록 변질되기 쉽다.

정규화의 가장 큰 목적은 중복 데이터를 제거해서 데이터를 완전하게 관리하는 것이다.

  • 모델의 확정성(Flexibility)이 좋아진다.
    • 함수 종속을 기반으로 속성을 결정자와 종속자로 구분해 모델 구조를 정의하기 때문에 데이터의 성격에 맞는 엔터티가 설계된다.
    • 업무가 확장돼도 그에 맞는 모델 구조로 확장하기 쉬워지므로 업무 변화에 유연한게 대처할 수 있다.
  • 그 밖에 이점
    • 데이터 무결성이 높아진다.
    • 데이터 저장 공간의 사용을 최소할 수 있기 때문에 성능을 향상 시킬 수 있다.
    • 데이터 모델 관리가 쉽다.

h3.2.10 아노말리(Anomaly)

아노말리

데이터의 이상 현상이다.

  • 중복 데이터 때문에 발생하며, 다음과 같은 아노말리가 발생할 수 있다.
구분내용
업데이트 아노말리릴레이션에서 속서의 값을 업데이트할 때 발생하는 데이터 이상 현상
삭제 아노말리릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상
삽입 아노말리릴레이션에 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상 현상

h3.2.11 정규형의 종류

  1. 1정규형(First Normal Form)
  2. 2정규형(Second Normal Form)
  3. 3정규형(Third Normal Form)
  4. BC정규형(Boyce-Codd Normal Form)
  5. 4정규형(Forth Normal Form)
  6. 5정규형(Fifth Normal Form)
  • { 1정규화, 2정규화, 3정규화 } : 기본 수행으로 정규화 대상의 대부분을 차지한다.
  • 실무에서는 { 1정규화, 2정규화, 3정규화 } 보다 { BC정규화, 4정규화, 5정규화 } 에 신경을 더 써야 한다.
  • 정규화는 일반적으로 순서대로 수행하지 않지만, 순서대로 수행하는 것이 더 체계적일 수는 있다.
  • 정규화의 목적은 몇 정규형인지 구분하는 것이 아니라, 중복이 발생하지 않고 아노말리가 발생하지 않도록 함수 종속에 근거해서 정규형 모델을 설계하는 것이다.

h3.2.12 1정규화와 원자(ATOM) 값

1정규형

모든 속성이 원자 값(반드시 하나의 값)이어야 한다.

  • 1정규화와 관련된 속성
    • 다가 속성(Multivalued Attributes): 같은 종류의 값을 여러 개 가지는 속성을 의미한다.
      • 물리적인 다가 속성이 존재하는 릴레이션
        • 모든 속성은 원자 값이어어한 한다는 1정규형 원칙을 위반한 릴레이션이다.
        • 물리적으로 보이는 것은 판단하기 쉽다.
      • 그럼2.7은 그림2.8과 같이 1정규형으로 설계해야 한다.
      • 그림2.7의 릴레이션 모델
        • 엔터티만 봐서는 여러 값을 저장했는지 알 수 없기 때문에 반드시 값을 봐야 알 수 있다.
        • 만약 데이터 타입의 길이가 길다면 추측할 수도 있다.
      • NFNF 릴레이션
        • 모든 속성이 하나의 값만을 가지고 있지만, 논리적으로는 하나의 값이라고 볼 수 없는 경우이다.
        • 물리적으로는 1정규형이라고 볼 수 있지만, 논리적으로는 1정규형이 아니다.
        • 또한, 2정규형 원칙 위반이다.
      • 그림2.11의 정규화
      • 논리적으로 여러 값을 가지는 엔터티
        • 같은 성격의 데이터를 여러 속성으로 나열해 관리하느 것도 논리적으로 여러 값을 관리하는 것이다.
        • 고객 엔터티의 전화번호 속성은 원자 값이 아니다.
      • 그림2.12의 정규화
    • 복합 속성(Composite Attributes): 하나의 속성이 여러 개의 속성으로 분리되는 것을 의미한다.
      • 업무 요건에 따라 속성의 관리 수준이 달라질 수 있다.
      • 예) 이름(성+이름), 주소(시+구+동), 날짜(연+월+일)

h3.2.13 1정규화의 대상

  1. 다가 속성이 사용된 릴레이션
  2. 복합 속성이 사용된 릴레이션
  3. 유사한 속성이 반복된 릴레이션
  4. 중첩 릴레이션
  5. 동일 속성이 여러 릴레이션에 사용된 경우
  • 다가 속성이 사용된 릴레이션
  • 복합 속성이 사용된 릴레이션
  • 유사한 속성이 반복된 릴레이션
  • 중첩 릴레이션: 하나의 인스턴스 내부에 다시 인스턴스가 존재하는 행태이다.
  • 동일 속성이 여러 릴레이션에 사용된 경우
    • 여러 엔터티에 동일한 성격의 속성이 존재하는 것
    • 예) 개인고객과 법인고객 엔터티에 모두 전화번호 속성이 존재하는 것

h3.2.14 1정규형과 비정규형

  • 정규형을 사용할지, 비정규형을 사용할지를 판단하는 주요 기준은 업무 요건이다.
  • 비정규형과 정규형의 특징
비정규형정규형
업무 요건의 변경에 따라 매우 취약하다. 즉 모델의 확장성이 좋지 않다.업무 요건의 변경에 유연하다. 즉 확장성이 좋은 모델이다.
인덱스 수가 증가하고, 속성을 종으로 보여주는 화면에 대한 쿼리가 복잡해진다.인덱스 수가 감소하고, 속성을 횡으로 보여주는 화면에 대한 쿼리가 비교적 복잡해진다.
속성이 추가될 가능성이 없을 때 사용할 수 있다.속성이 추가될 가능성이 존재할 때 사용한다.
속성 레벨로 관리되므로 인스턴스의 자식 엔터티를 가질 수 없다.인스턴스 레벨로 관리되므로 데이터의 자식 엔터티를 가질 수 있다.

h3.2.15 2정규형

2정규형

릴레이션의 모든 속성이 후보 식별자 전체에 종속적이다.

h3.2.16 2정규형 위반

  • 속성명이 명확하지 않을 때 발생한다.
  • 대분류와 소분류 관리
  • 고객그룹 엔터티

h3.2.17 3정규형

3정규형

일반 속성(비식별자 속성) 간에는 서로 직접 종속될 수 없으므로 함수 종속 관계가 없어야 한다.

  • 3정규형의 대상이 되는 속성을 이행 종속 속성이라고 한다.(X → Y → Z)

h3.2.18 BC정규형

BC정규형

모든 결정자는 주 식별자여야 하고, 릴레이션에 존재하는 종속자는 후보 식별자가 아니어야 한다.

  • 학점 관리
  • 슈퍼 식별자

h3.2.19 4정규형

4정규형

다가 종속을 제거하는 것이다.

  • 다가 종속(MVD: Multivalued Dependency): 한 릴레이션에 다가 속성이 두 개 이상 존재할 때, 하나의 다가 속성 값이 다른 다가 속성의 모든 값마다 중복되는 것이다.

h3.2.20 5정규형

4정규형

조인 종속을 제거하는 것이다.

  • 조인 종속(Join Dependency): 어떤 릴레이션을 분해한 다음에 조인해서 다시 원래의 릴레이션으로 복원할 수 있는 것이다.
  • 실무에서 사용하는 정규화는 단순히 릴레이션을 분해하는 것이 목적이 아니라, 중복이 발생하지 않도록 분해해서 데이터 무결성을 높이는 것이 목적이다.

h3.2.21 정규화 요약

  • 1정규화 수행 순서
    1. 제거해야 하는 속성을 언터티에서 제거한다.
    2. 제거한 속성이 포함된 새로운 엔터티를 만든다.
    3. 기존 엔터티를에서 새로운 엔터티로 관계를 상속한다.

※ 추가 엔터티가 생기면서 기존 엔터티에서 추가 엔터티로 관계를 상속하는 것이 핵심이다.

  • 2정규화 수행 순서
    1. 제거해야 하는 속성을 엔터티에서 제거한다.
    2. 제거한 속성이 포함된 새로운 엔터티를 만든다.
    3. 새로 만든 엔터티에서 기존 엔터티로 관계(식별 관계)를 상속한다.
  • 3정규화 수행 순서
    1. 제거해야 하는 속성을 엔터티에서 제거한다.
    2. 제거한 속성이 포함한 새로운 엔터티를 만든다.
    3. 새로 만든 엔터티에서 기존 엔터티로 관계(비식별 관계)를 상속한다.
  • BC정규화 수행 순서
    1. 후보 식별자 속성 중 종속자 속성을 엔터티에서 제거한다.
    2. 제거한 속성과 그 속성의 결정자 속성으로 새로운 엔터티를 만든다.
    3. 새로 만든 엔터티에서 기존 엔터티로 관계를 상속한다.
  • 4정규화 수행 순서
    1. 제거해야 하는 대상인 다가 종속에 포함된 속성을 엔터티에서 제거한다.
    2. 제거한 속성이 포함된 새로운 엔터티를 다가 속성 개수만큼 생성한다.
    3. 기존 엔터티와 새로 만든 엔터티와의 교차 관계 엔터티를 만든다.
  • 5정규화는 엔터티를 최대한 분해한다.

h3.2.22 3정규화까지만 수행하면 된다?

  • 3정규화까지만 수행하면 된다고 생각하는 이유
    1. 3정규화까지 하면 대다수의 중복을 해결할 수 있기 때문이다.
    2. BC정규화, 4정규화, 5정규화는 어렵기 때문이다.
    3. BC정규형 이상을 채택하면 조회(쿼리)가 어렵다고 생각하기 때문이다.
      {tip:title=정규화를 하는 이유는 중복 데이터를 제거하여 데이터 이상 현상(아노말리)을 최소하려는 것이지, 사용하기 편하게 하기 위한 것은 아니다.}
      {tip}
  • 정규화는 업무 요건에 맞게 함수 종속성을 따져 데이터 중복을 제거하는 것이다.
  • 몇 정규화까지만 수행해야 하는지를 논하는 것은 의미가 없고, 단지 업무 요건대로 정규화하는 것이 의미 있다.
  • 5정규화는 하지 않다고 해서 업무 요건을 저해하는 것도 아니며, 중복 데이터가 생기는 것이 아니기 때문에 예외이다.
  • 4정규화는 업무 요건과 관련 있기 때문에 4정규화까지 하면 된다.

h3.2.23 정규형과 성능

  • 정규화의 단점
    1. 엔터티를 분해한 후 조인한면 사용하는 블록이 늘어나기 때문에 성능에 나쁜 영향을 준다.
    2. 개발하기 까다롭고 불편하다.