1. 1정규형

1-1) 1정규형 정의

  • 모든 속성은 반드시 하나의 값을 가져야 함
  • 1정규화와 관련된 속성은 다가 속성과 복합 속성이 있음


1-2) 다가 속성(Multivalued Atributes)

  • 다가 속성은 같은 종류의 값을 여러 개 가지는 속성을 의미함
  • 위의 그림처럼 전화번호가 여러개의 값을 가지고 있어 식별자인 고객ID에 종속되지 않으므로 정규화된 엔터티가 아님
  • 엔터티의 모든 속성은 단일 값을 가져야 하므로, 다가 속성일 경우 별도의 엔터티가 필요함
  • 위의 내용을 모델로 표현하면 아래와 같이 정규화가 됨
  • 그림_4_5처럼 다가속성을 관리하지 않고 아래와 같이 관리할 수 있다
  • 하지만 그림_4_8은 물리적으로 1정규형이지만, 논리적으로 1정규형이 아님.
    고객이름과 주민등록번호 속성이 중복되었고, 고객ID에 종속되어 이 엔터티는 결국 2정규형을 만족하지 못함.
  • 그러나, 다가속성이 Fix되어 있을 경우, 성능을 위해 비정규화 모델을 사용할 수 있음,
  • 비정규화 시 주의할점은, 다가속성명을 정확히 기입해야 하며(전번_1, 전번_2, 전번_3과 같은 이름 불가), 다가속성 관점에 따른 인덱스가 많이 필요하고, NULL이 많아 OR 조건을 많이 사용해야 함


1-3) 복합 속성(Composite Attibutes)

  • 복합 속성이란 하나의 속성이 여러 개의 속성으로 분리될 수 있는 속성
  • 복합 속성은 무조건 분해해서는 안되며, 관리 요구사항에 따라 분해해야 함
    • 전체 주소를 하나의 속성에서 관리하지 않고, 분해하면 오히려 불편할 수 있음
    • 하지만, 동을 사용해서 집계한다는 요구사항이 많을 경우 분해해서 사용해야 함
  • 복합 속성 사례
    • 날짜 속성 : 연도, 월, 일로 구성된 대표적인 복합 속성
    • 코드 또는 번호 : 계좌번호나 보험번호 같이 하나의 값에 여러 의미를 두는 속성은 바람직하지 않음


1-4) 반복 속성

  • 반복 속성이란 다가 속성 중 하나로 하나의 엔터티에서 다수의 값이 있는 속성이며, 이 또한 분리를 해야 함
  • 이 엔터티를 분리할 경우 아래와 같이 됨
  • 다가 속성과 마찬가지로, 속성 개수가 Fix 될 경우 하나의 엔터티에서 관리할 수 있으나, 확장을 할 수 없음
  • 그러므로, 가급적 확장성을 위해 정규화를 통해 분리를 해야 함


1-5) 정규형과 비정규형

  • 비정규형
    • 업무 요건의 변경에 매우 취약하며, 확장성이 떨어짐
    • 인덱스 수가 증가하고 특정 요건 조회 시 SQL이 복잡해짐
    • 엔터티의 속성이 추가될 가능성이 없을 때 사용 가능
    • 속성 레벨로 관리되는 데이터의 자식 엔터티를 가질 수 없음
  • 정규형
    • 업무 요건의 변경에 유연하며, 확장성이 좋음
    • 인덱스 수가 감소하고, 특정 요건 조회 시 SQL이 단순해짐(하지만 요구사항에 따라 복잡해 질 수 있음)
    • 엔터티의 속성이 추가될 가능성이 존재할 때 사용
    • 로우 레벨로 관리되는 데이터의 자식 엔터티를 가질 수 있음
  • 비정규형 추가 단점
    • 그림_4_12에서 상품코드1과 상품코드2의 배송처가 다를 경우 배송처를 관리할 수 없음
    • 정규형 인스턴스는 개별 데이터를 의미하므로, 관리가 필요한 하위 데이터가 존재할 경우 자식 엔터티를 둘 수 있지만, 비정규형은 여러 데이터가 묶여 있어 자식 엔터티를 둘 수 없음


1-6) 인스턴스 관점에서 1정규형

  • 속성이 아닌 반복되는 인스턴스를 1정규형으로 분리할 경우
  • 위의 그림에서 고객ID와 주문일자 속성이 중복 데이터이며, 상품코드와 수량은 다가 속성의 성격을 가짐
  • 다가 속성이 여러 개 존재할 경우, 위의 그림처럼 표현이 가능한데 이를 중첩 릴레이션이라고 함.
  • 하나의 인스턴스 내부에 다시 인스턴스가 존재하는 형태
  • 주문번호 속성은 릴레이션의 주 식별자이며, 상품코드는 중첩 릴레이션의 주 식별자인 동시에 릴레이션의 부분 주 식별자도 됨
  • 중첩 릴레이션은 관점에 따라 정규형 위반이 달라짐
    • 그림_4_15의 경우 속성에 하나 이상의 값을 가지고 있으므로, 1정규형을 위반함
    • 그림 4_14의 경우 고객ID와 주문일자 속성이 주 식별자 중에 주문번호에만 종속되므로 2정규형을 위반함
  • 이를 정규화하면 위와 같이 나눌 수 있음


1-7) 엔터티별로 동일한 성격의 속성 존재

  • 개인고객, 법인고객 엔터티가 존재하고 양쪽 엔터티에 전화번호 속성이 존재하면 값이 다르더라도 반복 속성이 됨
  • 이상적인 구조는 동일한 성격의 속성은 전사 모델에서 한 번만 존재하는 것이 좋음


2. 2정규형

2-1) 2정규형이란?

  • 2정규형은 엔터티의 모든 속성이 후보 식별자 전체에 종속적이어야 함
  • 만약, 일반 속성 중에 후보 식별자 전체에 종속적이지 않고 후보 식별자를 구성하는 속성 일부에 종속적인 속성이 있을 경우, 이를 분리해야 2정규형
  • 즉, 모든 비식별자 속성은 후보 식별자 속성에 완전함수속성이 되야 하며, 부분함수종속이 될 경우 이를 분리해야 함
  • 2정규형은 후보 식별자를 구성하는 속성이 두 개 이상일 경우에만 대상이 되고, 단일 속성으로 후보 식별자가 구성될 경우 대상이 아님
  • 위 그림의 경우 C 속성은 후보 식별자 B에만 종속인 부분함수종속이므로, 이를 아래처럼 분리해야 함


2-2) 2정규형 사례

  • 위 사례에서는 상품명, 단가 속성이 상품코드 후보 식발자에만 부분함수종속이므로, 이를 아래처럼 분리해야 함
  • 그러나 최근에 성능을 위해 상품명을 상품 엔터티가 아닌 주문상품에 추가로 배치하여 아래처럼 구성하는 경우가 존재함
    (주문상품 엔터티에서 상품명으로 조회하는 일이 빈번히 일어나는 경우)
  • 하지만, 이는 지양해야 하며, 가급적 속성은 한 곳에서만 관리해야 함
    (역자 주 : 성능저하가 에상되는 부분이라면, 이와 같은 중복속성은 허용되는 것이 좋을것으로 보임)


3. 3정규형

3-1) 3정규형이란?

  • 3정규형은 이행적 종속성과 관련이 있음
    • 이행적 종속성은 X → Y이고 Y → Z이면 X → Z가 성립한다는 내용
    • 3정규형은 일반속성(비식별 속성)간의 종속 관계르 분해하면 3정규형이 됨


3-2) 3정규형 사례

  • 위의 그림에서 속성 C는 일반속성이면서 속성 D의 결장자
  • 또한 속성 D는 주 식별자인 A, B에 간접 종속되어 있음
  • 이 엔터티는 직접적인 함수 종속에 의해 분해해야 하며, 분해되면 아래처럼 분해 가능
  • 아래의 그림은 고객ID와 고객명이 함수 종속 관계이며, 고객ID를 알면 고객 이름이 하나만 결정되므로 고객명은 고객ID에 종속적인 속성
  • 일반속성에 종속이 발생했으므로, 아래의 그림처럼 엔터티 분리를 해야 함


4. 보이스코드 정규형

4-1) 보이스코드 정규형이란?

  • 보이스코드 정규형이란, 릴레이션이 존재하는 종속자가 후보 식별자일 경우 BC 정규형이 아님
  • 보이스코드 정규형을 만족하면 3정규형이 되지만, 3정규형을 만족하여도 보이스코드 정규형이 아닐 수 있음
  • 예제1의 경우, A, B가 주 식별자인데, 일반속성 C에 종속된 B가 주 식별자이므로 BC정규형에 어긋남.
    하지만, 일반속성간계 종속 관계가 없으므로 3정규형을 위반하지 않음
  • 예제2의 경우, 주 식별자는 A 속성 하나이며, B, C는 속성이 후보 식별자인데, 일반속성 D에 종속된 C가 후보식별자이므로 BC정규형에 어긋남
  • 이를 정규화하면 아래의 그림처럼 분해할 수 있음


4-2) 보이스코드 정규형 사례-1

  • 위 그림은 학생의 학점을 관리하는 엔터티인데, 학생은 여러 과목을 수강할 수 있으며, 교수는 한 과목만 강의할 수 있고 여러 교수가 동일과목을 강의할 수 없다고 가정할 경우 폐포는 아래와 같음
    • FD1 : (학생번호, 과목명) → (교수번호, 학점)
    • FD2 : 교수번호 → 과목명
  • 이 때, FD2의 종속자인 과목명이 FD1의 후보식별자이므로 BC정규형에 어긋남
  • 이를 BC정규형으로 분해할 경우 아래와 같이 나옴
  • 만약, 과목명을 함께 후보식별자로 한다 하더라도, 후보식별자간 종속관계가 되기 때문에 분해해야 함


4-3) 보이스코드 정규형 사례-2

  • 위의 예제또한 업체번호 속성이 업체명 속성을 종속하므로 BC정규형 위반이며, 분해해야 함


5. 4정규형

5-1) 4정규형이란?

  • 4정규형은 다가 종속을 분해하는 작업
  • 다가 종속이란, 한 릴레이션에 다가 속성이 두 개 이상 존재할 때 발생함
    • 하나의 A값에 대응하는 여러 개의 B 값이 있고, A 값에 대응하는 여러 개의 C 값이 있는 상태에서 B와 C가 관련이 없을 경우 다가 속성 관계
    • 속성 A 하나에 속성 B가 여러 값을 결정하면 A→→B로 표시하며, A가 B를 다가결정한다라고 하고 B가 A에게 다가 종속됐다 라고 함


5-2) 4정규형 사례

  • 홍길동의 기술은 모델링과 튜닝이며, 한국어와 영어를 구사하지만 기술과 언어와는 종속 관꼐가 없음
    (모델링을 영어로 할 수 있다는 의미가 아니므로, 기술과 언어는 서로 독립적임)
  • 이를 방지하기 위해 릴레이션2를 사용해야 하는데, 중복데이터가 많이 발생하여 이 또한 문제가 됨
  • 해서, 아래처럼 1:1로 매칭을 할 경우 기술과 언어가 서로 종속적인 관계처럼 보이므로 안됨
  • 그러므로, 다가 종속의 엔터티는 아래와 같이 분해를 해야해야 함
  • 4정규형은 1정규형과 비슷한데, 1정규형이 다가 속성을 분해하는 것이고 4정규형은 다가 종속을 분해하는 것이므로, 다가 속성을 1정규형으로 만들면 자연스럽게 다가 종속 또한 제거됨
  • 주의할 점은 다가 종속간계 관계가 없을 경우에만 4정규형을 해야 하며, 관계가 있을 경우 이를 분해하면 안됨


6. 5정규형

6-1) 5정규형이란?

  • 2, 3, BC정규형은 함수 종속 개념을 기반으로 수행한 것이며, 4정규형은 다가 종속 개념을 기반으로 수행함
  • 하지만 5정규형은 조인 종속 개념을 기반으로 하며, 조인 종속이 존재하면 5정규화 대상
  • 5정규형 조건 : 무손실 조인과 비부가적 조인을 만족한 엔터티가 5정규형
    • 무손실 조인(Lossless Join) : 하나의 엔터티를 여러 개의 엔터티로 분해한 후 공통(식별자) 속성으로 조인하여 데이터 손실 없이 원래의 릴레이션으로 복원할 수 있는 경우
    • 비부가적 조인(Nonadditive Join) : 조인한 결과에 원래 엔터티에 없는 데이터가 존재하지 않는 경우
  • 5정규형은 하나의 엔터티를 분해하고 다시 합쳤을 때 원래의 엔터티로 복원할 수 있으면 그 엔터티는 조인 종속이 존재하는 엔터티이며, 조인 종속이 존재하지 않을 때까지 분해한 엔터티


6-1) 5정규형 사례

  • 위 그림은 4정규형의 사례지만, 업무요건이 기술과 언어 사이에 관계가 있다고 가정할 경우임
  • 둘 사이에 관계가 존재하므로 이를 아래처럼 나눌 경우 5정규형이 됨
  • 5정규형은 하나의 엔터티에서 관리해 아노말리 현상이 발생하지 않고 관리가 힘들어 실무에서 자주 사용되지 않음
  • 하지만, 5정규형을 이해하고 있어야 정확한 정규화를 할 수 있으며, 만약 아래처럼 4정규화를 할 경우 기술과 언어 사이에 관계를 잃어버리므로 반드시 알고 사용해야 함


6-2) 5정규형 도식화

  • 5정규형은 3개체 관계와 연관이 있는데, 위와 같이 3개체 관계는 사원, 기술, 언어 세 엔터티의 주 식별자와 연돤된 관계임
  • 3개체 관계는 일반적으로 세 개의 엔터티로 분해할 수 있으며, 이렇게 분해할 경우 5정규형이 됨
  • 위의 그림은 4정규형과 5정규형을 도식화한 그림이며, 5정규형은 C 엔터티가 필요함
  • 실제 업무에서는 5정규형을 위반하지만, 3개의 관계 엔터티를 가져가지 않고 하나의 엔터티만 가져가는 경우가 대부분


7. 정규형 요약