본문 바로가기
IT 와 Social 이야기/Relational Data Modeling 프리미엄 가이드 - 김기창

04 정규화 (Normalization) 2

by manga0713 2019. 9. 23.

 

[ 정규형들 간의 (포함) 관계 : 이미지출처: https://ntersanseapa.gq/3684 ]

 

 

 

 

 

4.5. 정규형의 종류

 

 

- 정규형의 종류

  • 1정규형(First Normal Form)
  • 2정규형(Second Normal Form)
  • 3정규형(Third Normal Form)
  • 보이스코드 정규형(Boyce-Codd Normal Form. 이하 BC정규형)
  • 4정규형(Fourth Normal Form)
  • 5정규형(Fifth Normal Form)

 

- 1, 2, 3정규형이 정규화 대상의 대부분을 차지하지만 BC, 4, 5정규형을 위반하는 릴레이션도 자주 발생하므로 이론적으로는 명확하게 알고 있어야 한다.

 

- 몇 정규형이냐를 알려고 정규화를 하지는 않는다. 중요한 것은 중복이 발생하지 않고 아노말리가 발생하지 않도록 함수 종속에 근거해서 모델링을 수행하는 것이다.

 

- 일반적으로 3정규형을 만족한다는 것은 1, 2정규형도 만족하는 것을 의미한다. 따라서 정규화를 순서대로 수행하는 것도 의미가 있다.

 

- 정규화를 수행할 때 사례 데이터를 활용하는 것이 좋다. 속성으로만 구성된 스키마만으로는 판단하기 어려울 때가 많으므로 사례와 반례를 적절히 사용해야 한다.

 

- 1정규형

  • 모든 속성은 반드시 하나의 값을 가져야 한다.
  • 1정규형을 이해하려면 다가 속성(Multivalued Attributes)과 복합 속성(Composite Attributes)을 이해할 필요가 있다.
  • 다가 속성(Multivalued Attributes): 같은 종류의 값을 여러 개 가지는 속성

 

 

[ 정규형을 위반한 릴레이션 ]

 

 

    • 위 릴레이션과 같이 하나의 속성에 여러 전화번로를 관리하면, 속성은 반드시 하나의 값을 가져야 한다는 1정규형에 어긋난다. 전화번호는 식별자인 고객ID에 함수적으로 종속되지 않아서 고객ID를 알아도 유일하게 식별할 수 있는 전화번호가 없다. 따라서 정규화된 릴레이션이 아니다.
    • 위 릴레이션의 전화번호와 같은 다가 속성이 존재하면 새로운 릴레이션이 필요하다. 이를 1정규화하면 아래 릴레이션과 같이 다가 속성은 삭제되며 단일 값을 가지는 속성으로 구성된 새로운 릴레이션이 생긴다.

 

 

[ 1정규형 릴레이션 ]

 

 

    • 이를 모델로 표현하면 아래의 오른쪽 모델과 같다.

 

 

[ 1정규형 모델 ]

 

 

 

    • 왼쪽 모델에서 전화번호 속성이 여러 의미의 번호가 관리된면, 즉 여러 값을 관리하면 오른쪽 모델과 같이 새로운 엔터티를 생성해 원래 엔터티와 1:M 관계가 되도록 한다.
    • 실제로 하나의 속성에 여러 값을(예에서 처럼 여러 전화번호를) 관리하는 예는 흔치 않고 이와 유사하게 아래와 같은 릴레이션으로 관리한다. 이 릴레이션은 주 식별자(#표시)는 고객ID와 전화번호 속성이다.

 

 

[ 중복이 존재하는 1정규형 ]

 

 

    • 위 릴레이션은 물리적으로 모든 속성이 하난의 값만을 가지고 있지만, 논리적으로는 하나의 값을 가지고 있다고 볼 수 없다. 즉, 논리적으로는 1정규형이 아니며, 고객이름과 주민등록번호 속성은 중복되었고, 고객ID에 종속돼서 결국 2정규형도 만족하지 못한다.
    • 정규형 모델은 때에 따라 쿼리 성능을 고려해야 한다. 만약 위의 릴에이션에서 관리해야 할 전화번호가 향후에도 더는 늘어나지 않고 고정적이라면 즉 집, 사무실, 휴대폰 전화번호가 최대로 관리할 전화번호라면 아래 릴레이션과 같이 관리할 수 있다. (반복되는 속성이 고정적이라면 비정규형을 채택할 수도 있다.)

 

 

[ 1정규형에 위배되는 릴레이션과 모델 ]

 

 

 

    • 위 모델과 같이 비정규형을 채택할 때 주의할 점은 속성에 의미를 명확하게 부여해야 한다는 것이다. 전화번호1, 전화번호2, 전화번호3과 같이 사용하는 것은 바람직하지 않다.
    • 또한 위 모델과 같은 비정규형은 널(Null) 데이터가 많이 발생할 수 있고 인덱스가 많이 필요하며 'OR' 조회가 발생할수 있는 등의 단점이 존재하므로 상황에 맞게 선택해야 한다.

 

  • 복합 속성(Composite Attributes): 하나의 속성이 여러 개의 속성으로 분리될 수 있는 속성
    • 속성의 관리 수준, 즉 속성의 관리 범위에 의해 달라질 수 있다. 요건인 관리 범위를 따르지 않으면 원자값을 판단할 수 있는 기준이 명확하지 않게 된다.
    • 주소 속성의 경우 시, 구, 동, 번지 데이터를 관리하면 복합 속성이 된다.
    • 원칙적으로 하나의 의미만을 나타내는 속성들로 분해해야 한다. 시, 구, 동, 번지로 속성이 분해돼 결국 속성 개수가 늘어난다.

 

 

[ 복합 속성이 존재하는 릴레이션 ]

 

 

    • 복합 속성처럼 보인다고 무조건 분해하면 안 되고 데이터 관리 수준(요건)에 따라 분해해야 한다.
    • 위의 예제에서 전체 주소를 하나의 속성에서 관리하지 않고 분해하면 오히려 불편할 수 있다. 요건은 항상 한꺼번에 입력하고 한꺼번에 조회하는데 분해해서 입력하고 각자를 합쳐서 조회하는 것은 바람직하지 않다.
    • 만약 시, 구, 동을 구분해서 사용해야 할 요건이 있다면, 즉 동을 사용해서 집계한다는 등의 요건이 존재하고 자주 사용되면 아래와 같이 분해하는 것이 좋다.

 

 

[ 복합 속성을 제거한 1정규형 릴레이션과 모델 ]

 

 

 

    • 날짜(Date)도 연도와 월, 일로 구성된 대표적인 복합속성이다. 하지만 특수한 때를 제외하고 보통 날짜를 관리할 때 년, 월, 일을 분리하지 않는다.
    • 이와 비슷하게 사용하는 속성이 주 식별자로 사용하는 코드나 번호다. 보통 코드만 보고 많은 의미를 알 수 있게 하려고 여러 의미를 부여할 때가 많다. 계좌번호, 보험번호 등에 어떤 지점에서 해당 일에 몇 번째로 계약했는지를 알 수 있도록 관리하는 것이 대표적이다. 이처럼 하나의 속성에 여러 의미가 존재하는 것은 바람직하지 않다.
  • 반복 속성
    • 한 릴레이션에 반복 형태의 속성이 있어서는 안 된다.
    • 반복되는 속성도 다수의 값을 가지는 속성과 마찬가지로 일대다(1:M) 관계의 엔터티를 추가해 1정규형으로 만들어야 한다.

 

 

[ 반복 속성이 존재하는 릴레이션 ]

 

 

 

 

 

[ 1정규형 릴레이션과 모델 ]

 

 

 

    • 위의 두 번째 그림의 왼쪽과 같은 비정규형(Non-Normal Form)은 종류가 지속적으로 불변일 때를 제외하고 선택하지 않는 것이 바람직하다.
    • 반복되는 속성이 고정돼 불변일 때는 속성 끝에 순번을 붙이거나 속성 앞에 롤(Role) 이름을 사용하여 표현할 수 있다.
    • 반복 속성의 도메인은 동일하다.
  • 정규형과 비정규형의 일반적인 특징
    • 비정규형(Non-Normal Form)
      1. 업무 요건의 변경에 매우 취약하다. 즉 모델의 확장성이 좋지 않다.
      2. 인덱스 수가 증가하고 특정 요건 조회 시 SQL이 복잡해진다.
      3. 엔터티의 속성이 추가될 가능성이 없을 때 사용 가능하다.
      4. 속성 레벨로 관리되는 데이터의 자식 엔터티를 가질 수 없다.
    • 정규형(Normal Form)
      1. 업무 요건의 변경에 유연하다. 즉 확장성이 좋은 모델이다.
      2. 인덱스 수가 감소하고 특정 요건 조회 시 SQL이 단순해진다. 단 요건(화면)에 따라 SQL이 복잡해질 수 있다.
      3. 엔터티의 속성이 추가될 가능성이 존재할 때 사용한다.
      4. 로우 레벨로 관리되는 데이터의 자식 엔터티를 가질 수 있다.
  • 인스턴스를 대상으로 수행할 때도 있다.
    • 아래 릴레이션에서 고객ID와 주문일자 속성이 중복 데이터며 상품코드와 수량은 다가 속성의 성격을 가진다.

 

 

[ 정규형이 아닌 릴레이션 ]

 

 

    • 위와 같이 다가 속성이 여러개 존재하는 릴레이션은 아래와 같이 표현할 수 있는 데 이를 중첩 릴레이션(Nested Relation 또는 Relation-Valued Attribute)라고 한다. 하나의 인스턴스 내부에 다시 인스턴스가 존재하는 형태이어서 중첩 릴레이션이라고 한다.
    • 위 릴레이션의 주문번호 속성은 릴레이션의 주 식별자이며 상품코드 속성은 중첩 릴레이션의 주 식별자이면서 전체 릴레이션에서 부분 주 식별자(Partial Primary Identifier)가 된다.

 

 

[ 중첩 릴레이션 ]

 

 

    • 위의 두 릴레이션은 속성이 하나 이상의 값을 가지게 되어 1정규형 위반(그림 "정규형이 아닌 릴레이션"), 고객ID와 주문일자 속성이 주 식별자 중 주문번호에만 종속되므로 2정규형 위배(그림 "중첩릴레이션") 따라서 아래와 같이 정규화

 

 

[ 정규형 릴레이션과 모델 ]

 

 

  • 엔터티별로 동일한 성격의 속성이 존재하는 것도 1정규형 위반
    • 개인고객, 법인고객 엔터티가 따로 존재하고 양쪽에 전화번호 속성이 존재하면 값이 다르더라도 반복 속성이 된다.
    • 가장 이상적인 구조는 동일한 성격의 속성은 저사 모델에서 한 번만 존재하는 것이다.