관계형 데이터 모델링 노트 2장

'데이터모델링 도서인 `관계형 데이터 모델링 노트 개정판` 책의 `2장 엔터티 이야기` 요약 및 정리

정민호정민호

1. 엔터티 이야기

2. 정규화 이야기


요약
  1. 정규화 개요

    1. 정규화(Normalization)란?

      • 엔터티는 정규화에 의해 생성되고 정규화는 함수 종속으로 수행되며, 함수 종속은 키가 없이는 존재 할 수 없는 개념

      • 중복을 최대한 제거하는 과정으로 식별자에 종속된 유사한 속성들은 모으고, 종속되지 않은 독립적인 속성들은 분리하여 속성을 명확히 구별하는 것

      • 모든 속성은 주인이 되는 하나의 엔터티에만 속하고, 주 식별자(Primary Key)만이 다른 엔터티에 존재하는 것

      • 키가 아닌 모든 속성은 키에 직접 종속되도록 분해하는 것으로 릴레이션에 결정자(Key)를 찾지 못하면 정규화를 할 수 없음

      • 함수 종속을 사용해서 유사한 속성끼리 모아 하나의 릴레이션으로 만드는 체계적인 방법

    2. 함수 종속(FD;Function Dependency)란?

      • 속성 간의 연관성을 명확하게 파악하는 데 도움이 되며, 이는 엔터티의 성격(정체성)을 명확히 하는 것

      • 밀접한 속성을 모아 하나의 릴레이션으로 만드는 체계적인 방법

      • 릴레이션에서 A 속성의 값이 B 속성의 값을 유일하게 식별할 수 있다면, B 속성은 A 속성에 함수적으로 종속됐다고 함

      • 속성 간의 종속성을 분석해 집합을 분리하기 위한 것이므로 속성과 엔터티를 정의하고 관계를 파악하는 데 절대적인 역할을 함

      • 한 속성이 다른 속성을 유일하게 식별할 수 있는지는 업무 요건에 따라 달라짐

    3. 결정자(Determinant)와 종속자(Dependent)

      • 결정자(Determinant)는 속성 간의 종속성을 분석할 때의 기준이 되는 값(식별자(Key))이며, 또 릴레이션에 모든 속성을 함수적으로 결정하는 최소한의 속성(후보 키(Candidate Key))

      • 종속자(Dependent)는 결정자의 값에 의해 정해질 수 있는 값(비식별자(Non-Key))

    4. 폐포(Closure)

      • X의 폐포는 X에 종속돼따고 추론(Reasoning) 할 수 있는 모든 속성의 집합

      • 식별자(Key)가 정확한지 검증하는 도구로 활용

      • 함수 종속의 밑바탕에 깔려있는 개념

    5. 종속성 추론 규칙

      • Y ⊆ X 이면 X → Y 성립

      • X → Y 이면 XZ → XY 성립

      • X → Y 이고 Y → Z 이면 X → Z 성립

      • x → YZ 이면 X → Y 이고 X → Z 성립

      • X → Y 이고 X → Z 이면 X → YZ 성립

      • X → Y 이고 YZ → W 이면 XZ → W 성립

    6. 그냥 릴레이션(NFNF; Non First Normal Form, NF)과 비정규형(Denormalization)

      • 그냥 릴레이션은 그냥 그대로의 릴레이션으로 사용하던 릴레이션에 속성을 잘못 추가해서 사용할 때나 새로 설계할 때 정규화와 무관하게 화면이나 업무 요건 문장을 그대로 릴레이션으로 설계할 때 생길 수 있음

      • 비정규형 릴레이션은 정규형이 아닌 릴레이션을 뜻함

    7. 아노말리(Anomaly)

      • 아노말리 개요

        • 아노말리는 데이터의 이상 현상 뜻하며, 데이터 품질을 저하시키는 주범

        • 데이터가 서로 맞지 않는 아노말리는 중복 데이터로 인해 발생

        • 중복 데이터 존재시 의도하지 않은 이상 현상이 발생 할 수 있음

        • 아노말리는 방지하는 근본적인 방법은 정규화

        • 아노말리는 애플리케이션에서 방지할 수 있으나 이는 임시방편적인 편법

        • 중복 데이터가 사용되면 언젠가는 데이터 이상 현상이 발생

      • 아노말리 종류

        • 업데이트 아노말리 : 릴레이션에서 속성의 값을 업데이트할 때 발생하는 데이터 이상 현상

        • 삭제 아노말리 : 릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상

        • 삽입 아노말리 : 릴레이션에 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상현상

  2. 정규화 상세

    1. 정규화를 왜 해야하는지

      • 정규화는 단순히 릴레이션을 분해하는 것이 목적이 아니라, 중복이 발생하지 않도록 분해해서 데이터 무결성을 높이는 것이 목적

      • 데이터의 성격에 맞는 엔터티를 설계하기 위함

      • 확장성이 좋은 모델을 설계하기 위함

      • 데이터 이상 현상(아노말리) 방지

      • 중복 데이터가 사용되면 언젠가는 데이터 이상 현상이 발생

      • 비정규형은 중복 데이터에 대한 정합성 맞출 수 있도록 완전하게 제어하지 못함

    2. 정규화 방법

      • 먼저 릴레이션의 키를 도출한 뒤 정규화 수행

      • 어떤 방법을 사용하든 정규화는 키를 구하는 것으로 시작하며, 키를 구하려면 모든 함수 종속을 찾아야함

      • 상향식 모델링 시 기존 엔터티의 주 식별자를 검증하면서 정규화 수행

      • 하향식 모델링 시 엔터티와 주 식별자를 새롭게 분석하며, 분석 시 후보 식별자를 정한 수 맞는지 검증

    3. 정규화 수행시 장점

      • 데이터 및 엔터티의 완전성(completeness)과 확장성(Flexibility) 확보

      • 데이터 무결성 향상

      • 데이터 저장 공간 사용 최소화

      • 데이터 모델 단순화

    4. 정규형과 비정규형의 특징

      • 정규형

        • 업무 요건의 변경에 유연하여, 확장성이 좋은 모델

        • 인덱스 수가 감소하고, 속성을 횡(橫, 가로)으로 보여주는 화면에 대한 쿼리가 비교적 복잡해짐

        • 반복 속성이 추가될 가능성이 존재할 때 사용

        • 인스턴스 레벨로 관리되므로 데이터의 자식 엔터티를 가질 수 있음

      • 비정규형

        • 업무 요건의 변경에 매무 취약하여, 확장성이 좋지 않은 모델

        • 인덱스 수가 증가하고, 속성을 종(縱, 세로)으로 보여주는 화면에 대한 쿼리가 복잡해짐

        • 반복 속성이 추가될 가능성이 없을 때 사용할 수 있음

        • 전체 속성 레벨로 관리되므로 해당 데이터의 자식 엔터티를 가질 수 없음

  3. 정규형의 종류

    1. 개념 기반 분류에 따른 정규형의 종류

      • 원자성(ATOM) 개념 기반의 1정규형

      • 함수 종속(Functional Dependency) 개념 기반의 2정규형, 3정규형, BC정규형

      • 다가 종속(Multivalued Dependency) 개념 기반의 4정규형

      • 조인 종속(Join Dependency) 개념 기반의 5정규형

    2. 1정규형

      1. 1정규화 개요

        • 속성은 반드시 하나의 값을 가져야하며 반복 형태가 존재하면 안 된다는 것이 1정규형의 원칙

        • 복합 속성과 다가 속성, 중첩된 릴레이션과 같은 반복 그룹이 나타나지 말아야 1정규형을 만족

        • 이력 데이터까지 고려하고, 모델의 궁극적인 확장성을 고려하면 1정규형 위반을 허용하는 경우는 거의 없는게 정상

      2. 1정규화 대상

        • 다가 속성이 사용된 릴레이션

        • 복합 속성이 사용된 릴레이션

        • 유사한 속성이 반복된 릴레이션

        • 중첩 릴레이션

        • 동일 속성이 여러 릴레이션에 사용된 경우

        • 반복된 속성이 사용된 릴레이션

      3. 1정규화 수행방법

        • 제거해야 하는 속성을 엔터티에서 제거

        • 제거한 속성이 포함된 새로운 엔터티를 만듬

        • 기존 엔터티에서 새로운 엔터티로 관계를 상속

    3. 2정규형

      1. 2정규화 개요

        • 2정규화는 부분 함수 종속을 제거하는 것

        • 일반 속성 중에서 후보 식별자 전체에 종속적이지 않은 속성(후보 식별자의 일부 속성에만 종속된 속성)을 찾아 기본 엔터티에서 제거하고, 그 속성의 결정자를 주 식별자로 하는 새로운 상위 엔터티를 생성하는 것

        • 릴레이션의 모든 속성이 후보 식별자 전체에 종속적일 때

        • 주 식별자가 두 개 이상인 릴레이션에서 발생

        • 부분 함수 종속으로 발생한 중복 데이터를 제거하는 것이 2정규화

        • 2정규화는 후보 식별자를 구성하는 속성이 두개 이상일 때만 대상이 되고, 단일 속성일 때는 대상이 안됨

        • 즉 전체에 종속되지 않고 일부에 종속(Partial Functional Dependency)된 속성을 2정규형이 아님

      2. 2정규화 대상에 대한 판단 및 주의사항

        • 간혹 2정규화를 해야하는지 판단이 힘들 때가 있는데, 이는 속성 명을 명확히 붙이지 않아서 발생하기 때문에 발견하기 쉽지 않음

        • 따라서 데이터를 보고 분석해야 정확히 2정규화 대상인지를 판단할 수 있음

        • 모델에서 속성 명이나 엔터티 명을 잘못 사용해 의도한 것과 다르게 모델을 설계하는 경우가 있는데, 이 때문에 2정규화를 하게 될 수도 있어 주의해야함

        • 엔터티를 정확하게 분석해서 엔터티 명과 속성 명을 명확하게 사용하면 이런 문제는 발생하지 않을것

      3. 2정규화 수행방법

        • 제거해야 하는 속성을 엔터티에서 제거

        • 제거한 속성이 포함된 새로운 엔터티를 만듬

        • 새로 만든 엔터티에서 기존 엔터티로 관계(식별관계)를 상속

        • (관계 속성은 주 식별자에 포함되며, 관계가 식별 관계(Identifying Relationship))

    4. 3정규형

      1. 3정규화 개요

        • 3정규화는 일반 속성(비식별자 속성)간의 종속 관계를 분해하는 것

        • 바로 상위의 관계(1차 관계)만을 관리하는 것이 중요하듯, 이행 종속이 아닌 직접 종속된 속성만으로 엔터티를 설계해야 함

        • 3정규형의 대상이 되는 속성을 이행 종속 속성(Transitive Dependency Attribute)이라 함

        • 이행적 종속성은 Y가 X에 종속되고 Z가 Y에 종속되면 Z는 X에도 종속된다고 추론하는 것을 말함

        • 즉 X → Y 이고 Y → Z 이면 X → Z가 성립하며, 이때 Y느 릴레이션의 후보 식별자나 후보 식별자의 일부가 아닌 일반 속성(비식별자 속성)

      2. 3정규화 예

        • {(#A#B → C , #A#B → D , C → D)} 일 때, C는 일반 속성이면서 속성 D의 결정자기도 함

        • 즉 속성 D는 주 식별자인 A와 B에 간접 종속돼 있으므로 직접적인 함수 종속에 의해서 분해돼야 함

        • 이행 종속된 속성 D와 그 속성의 결정자 역할을 하는 속성 C를 분해해서 새로운 릴에이션으로 생성 {(#A#B → C), (#C → D)}

      3. 3정규화 수행방법

        • 제거해야 하는 속성을 엔터티에서 제거

        • 제거한 속성이 포함한 새로운 엔터티를 만듬

        • 새로 만든 엔터티에서 기존 엔터티로 관계(비식별 관계)를 상속

        • (상속한 관계가 일반속성이 되며, 관계는 비식별 관계(Non-Identifying Relationship))

    5. BC정규형

      1. BC정규화 개요

        • 3정규형을 보강한 정규형으로 모든 결정자는 주 식별자여야 한다는 정규형으로 릴레이션에 존재하는 종속자는 후보 식별자가 아니어야함

        • 함수 종속의 종속자가 후보 식별자(주 식별자를 포함한 후보 식별자)에 포함된 모델은 BC정규형을 위반한 모델

      2. BC정규형 구분

        • 속성 Y에 종속된 Z가 후보 식별자에 포함되면 BC정규형이 아님

        • Z가 후보 식별자에 포함되는지에 따라 3정규형과 BC정규형이 구분됨

        • Z가 후보 식별자에 포함되더라도 일반 속성간에는 종속성이 없으므로 3정규형은 만족함

      3. BC정규형 예

        • {(#A#B → C, #A#B → D, C → #B)} 일 때, 일반 속성 C에 종속된 종속자 #B가 주식별자에 포함돼 있으므로 BC 정규형에 어긋나지만 일반 속성(C, D) 사이에는 종속 관계가 없으므로 3정규형은 만족함

        • BC 정규형을 만족하기 위해서 주식별자 #B 를 일반속성으로 변경하고 일반 속성 C를 주식별자로 변경하며, 속성 C와 B를 분해해서 새로운 릴레이션으로 생성

        • {(#A#C → D), (#C → B)}

      4. BC정규화 수행방법

        • 후보 식별자 속성 중 종속자 속성을 엔터티에서 제거

        • 제거한 속성과 그 속성의 결정자 속성으로 새로운 엔터티를 만듬

        • 새로 만든 엔터티에서 기존 엔터티로 관계를 상속

    6. 4정규형

      1. 4정규화 개요

        • 다가 종속 개념이 기반이 되는 정규형으로 이를 이해하려면 다가 종속(MVD; Multivalued Dependency)을 이해해야 함

        • 다가 종속은 한 릴레이션에 다가 속성이 두 개 이상 존재할 때 발생할 수 있으며, 다가 속성 값 사이에 다대다(M:M) 관계가 발생 하는 것

        • 다가 종속이 발생하여 M*N 만큼 인스턴스가 생성돼 중복 데이터 발생

        • 서로 관계가 없는 다가 속성 간에 종속성이 생긴 릴레이션은 많은 중복 데이터가 생기기 때문에 4정규화를 하여 중복 데이터를 제거해야 함

        • 데이터를 정확하고 효율적으로 관리할 수 있도록 해주며 데이터 사용 공간도 절약

        • 1정규화와 유사하나 1정규화는 다가 속성을 엔터티로 분해하는 것이고 4정규화는 서로 관련이 없는 다가 속성을 개별 엔터티로 분해하는 것으로 다가 속성을 1정규형으로 만들면 다가 종속은(MVD)은 자연히 제거됨

      2. 4정규형 발생 조건

        • 하나의 A 값에 대응하는 여러 개의 B 값이 있고 A 값에 대응하는 여러 개의 C 값이 있으며, B 값과 C 값 사이에는 아무런 상관관계가 없는데 A, B, C 값을 하나의 릴레이션에서 관리할 때 다가 종속이 발생

        • 즉 두 개의 독립적인 일대다(1:M) 관계의 속성이 하나의 릴레이션에 존재하면 다가 종속이 발생

      3. 4정규형 수행방법

        • 제거해야 하는 대상인 다가 종속에 포함된 속서을 엔터티에서 제거

        • 제거한 속성이 포함된 새로운 엔터티를 다가 속성 개수만큼 만듬

        • 기존 엔터티와 새로 만든 엔터티와의 교차 관계 엔터티를 만듬

    7. 5정규형

      1. 5정규화 개요

        • 더 이상 쪼갤 수 없도록 릴레이션을 쪼갠 릴레이션

        • 무손실 분해와 비부가적 분해가 되도록 분해한 릴레이션

        • 조인 종속(Join Dependency) 개념 기반으로 조인 종속이 없는 릴레이션

        • 어떤 릴레이션을 분해(정규화)한 다음에 조인해서 다시 원래의 릴레이션으로 복원할 수 있다면, 그 릴레이션은 조인 종속이 존재하는 릴레이션

        • 5정규형은 릴레이션을 분해하고(Project) 합치는(Join) 개념 때문에 PJ정규형(Project-Join Normal Form)이라고도 함

        • 5정규형은 3개체 관계(Ternary Relationships)와 연관되며, 3개체 관계가 발생한 릴레이션은 일반적으로 세 개의 릴레이션으로 분해할 수 있고 세 개의 릴레이션으로 분해하면 5정규형을 만족함

        • 5정규형은 지나치게 이론적이며 DBMS에서 실제로 사용하기에는 부적합하지만, 오히려 실무에서 효율적이지 않기 때문에 실익이 없는 5정규형을 사용하지 않기 위해서라도 구분할 수 있어야함

      2. 5정규형 수행방법

        • 데이터가 변질되지 않는한 엔터티를 최대로 분해

  4. 정규형과 성능

    1. 정규형과 성능 개요

      • 쓰기 성능은 일반적으로 정규형의 성능이 좋으며, 조회 성능은 요건에 따라서 비정규형의 성능이 더 나빠질 수 있음

      • 데이터베이스를 사용하는 가장 근본적인 이유는 데이터를 효과적으로 관리하기 위함으로써 반드시 정규형을 채택해야하며 성능 차원에서 문제가 되는 중요한 요건이 있을 때만 비정규형을 고려

      • 사소한 성능 향상을 위해 데이터 무결성을 저해하는 것은 소탐대실일 것

    2. 조회 성능 저하에 대한 오해

      • 정규화하여 엔터티를 분해하였을 때 조인하는 과정에서 사용하는 블록이 능어남으로써 성능에 나쁜 영향을 미침

      • 따라서 일반적인 조회 요건이라면 미세하게라도 정규형이 비정규형보다 조회 성능이 떨어질 가능성이 높음

      • 다만 정규화를 하면 중복 데이터가 최소화되고 인스턴스의 크기가 작아지므로, 한 블록(8Kbytes)에 저장하는 인스턴스는 많아지게됨

      • 이 점이 여러 건의 조회뿐만 아니라 한 건의 조회에도 특정 속성을 조회할 때는 정규형의 성능이 좋아질수 있는 원인

      • 정규화의 기본 개념이 함수 종속이므로 종속성, 의존성이 같은 데이터(성격이 같은 데이터)는 업무에서 같이 조회될 가능성도 커져 최소의 블록을 사용하는 효과를 얻게됨

      • 그로인해 블록이 다시 사용될 가능성(확률)이 커짐으로써 메모리에 존재하는 블록을 조회할 메모리 적중률(Hit Ratio)이 높짐으로써 성능이 좋아짐

    3. 쓰기(Insert, Update, Delete) 성능

      • 조회 성능과는 다르게 쓰기 성능(Insert, Update, Delete)이 좋다는 것은 중복 속성이 없기 때문

      • 비정규형은 어떤식으로든 중복 데이터를 사용하며, 한 속성을 다루는게 아니라 여러 속성을 다루기 때문에 쓰기 시간이 오래 걸림


2.1. 정규화에 대한 서설

  • 속성의 주인(엔터티)을 찾는 과정

  • 모든 속성은 주인이 되는 하나의 엔터티에만 속하고, 주 식별자(Primary Key)만이 다른 엔터티에 존재하는 것

2.1.1. 정규화 설계 개요

  • 속성의 종속성을 파악하여 엔터티를 설계하는 것

  • 핵심은 식별자(Identifier)와 종속성(Dependency)

  • 엔터티를 대표하는 속성(업무 식별자)을 찾은 후에, 그 속성을 기준으로 대상 속성이 종속됐는지 여부를 판단

  • 업무 요건에 필요한 속성을 묶어서 엔터티 설계

2.1.2. 정규화 설계 방법

  • 정규화는 일반적으로 순서대로 수행되지 않으나, 크게 상향식(속성을 제거하면서 정규화), 하향식(생각하는 과정을 통해 정규화)으로 구분할 수 있음

  • 순서대로 수행하는 것이 현실적이진 않을 수 있지만, 더 체계적일 수 있음


2.2. 정규화(Normalization)란

  • 중복을 최대한 제거하는 과정으로 식별자에 종속된 유사한 속성들은 모으고, 종속되지 않은 독립적인 속성들은 분리하여 속성을 명확히 구별하는 것

  • 특정 속성이 어떤 엔터티에 위치해야 옳은지를 따져서 제자리인 한 곳에만 있도록 하는 과정

2.2.1. 정규화 개요

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

  • 특정 속성이 어떤 엔터티에 위치해야 옳은지를 따져서 제자리인 한 곳에만 있도록 하는 과정

  • 더는 분해될 수 없는 엔터티

  • 속성 간의 부정확한 종속성을 없애는 것

  • 중복 속성을 제거하기 위함이지 액세스 성능을 최적화하기 위함은 아님

  • 다만 정규화를 수행할 때는 성능을 고려해야 하며, 서능 문제가 분명할 때는 비정규화를 고려해야함


2.3. 함수 종속(FD;Function Dependency)이란?

  • 릴레이션 내에 존재하는 속성 간의 종속성

  • 한 속성의 값을 알면 다른 속성의 값은 저절로 결정되는, 두 속성 간의 일종의 제약

  • 밀접한 속성을 모아 하나의 릴레이션으로 만드는 체계적인 방법

2.3.1. 함수 종속 개요

  • 모든 종속의 기초가 되는 종속

  • 릴레이션에서 A 속성의 값이 B 속성의 값을 유일하게 식별할 수 있다면, B 속성은 A 속성에 함수적으로 종속됐다고 함

  • 속성 간의 종속성을 분석해 집합을 분리하기 위한 것이므로 속성과 엔터티를 정의하고 관계를 파악하는 데 절대적인 역할을 함

  • 한 속성이 다른 속성을 유일하게 식별할 수 있는지는 업무 요건에 따라 달라짐

  • 밀접한 속성을 모아 하나의 릴레이션으로 만드는 체계적인 방법


2.4. 결정자와 종속자

  • 결정자(Determinant)는 속성 간의 종속성을 분석할 때의 기준이 되는 값(식별자(Key))

  • 종속자(Dependent)는 결정자의 값에 의해 정해질 수 있는 값(비식별자(Non-Key))

2.4.1. 결정자(Determinant)와 종속자(Dependent) 개요

  • 속성 Y가 속성 X에 의해 함수적으로 종속되다는 말은 속성 X의 값을 이용해 속성 Y의 값을 유일하게 식별할 수 있다는 의미

  • 이 때 X를 결정자, Y를 종속자라고 하고 X는 Y를 함수적으로 결정한다고하며, 기호로 X → Y, y=f(x) 로 표현

  • X→Y→Z와 같은 종속을 이행 종속(Transitive Dependency)라 하며, 3정규형과 관련된 종속

  • 함수 종속은 직접 종속을 의미

2.4.2. 결정자(Determinant)란?

  • 결정자(Determinant)는 속성 간의 종속성을 분석할 때의 기준이 되는 값(식별자(Key))

  • 릴레이션에 모든 속성을 함수적으로 결정하는 최소한의 속성(후보 키(Candidate Key))

2.4.3. 종속자(Dependent)란?

  • 종속자(Dependent)는 결정자의 값에 의해 정해질 수 있는 값(비식별자(Non-Key))


2.5. 함수 종속과 폐포

  • 폐포는 식별자(Key)가 정확한지를 검증하는 도구

  • X의 폐포는 X에 종속됐다고 추론(Reasoning)할 수 있는 모든 속성의 집합을 의미

2.5.1. 폐포(Closure)란

  • 릴레이션 R의 속성 X가 키인지 알려면 X의 폐포를 알아야함

  • X의 폐포는 X에 종속됐다고 추론(Reasoning)할 수 있는 모든 속성의 집합을 의미

  • X→(Y,Z)라면 X의 폐포는 X 자신과 Y와 Z다 (X^+ = X, Y, Z)

2.5.2. 종속성 추론 규칙

  • Y ⊆ X 이면 X → Y 성립

  • X → Y 이면 XZ → XY 성립

  • X → Y 이고 Y → Z 이면 X → Z 성립

  • x → YZ 이면 X → Y 이고 X → Z 성립

  • X → Y 이고 X → Z 이면 X → YZ 성립

  • X → Y 이고 YZ → W 이면 XZ → W 성립


2.6. 함수 종속과 정규화

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

  • 엔터티는 정규화에 의해 생성되고 정규화는 함수 종속으로 수행되며, 함수 종속은 키가 없이는 존재 할 수 없는 개념

2.6.1. 정규화 수행 방법

  • 먼저 릴레이션의 키를 도출한 뒤 정규화 수행

  • 어떤 방법을 사용하든 정규화는 키를 구하는 것으로 시작하며, 키를 구하려면 모든 함수 종속을 찾아야함

  • 상향식 모델링 시 기존 엔터티의 주 식별자를 검증하면서 정규화 수행

  • 하향식 모델링 시 엔터티와 주 식별자를 새롭게 분석하며, 분석 시 후보 식별자를 정한 수 맞는지 검증


2.7. 그냥 릴레이션과 비정규형 릴레이션

  • 모든 릴레이션은 비정규형 릴레이션을 사용하더라도 정규화 과정을 거쳐야함

2.7.1. 그냥 릴레이션(NFNF; Non First Normal Form, NF)란

  • 그냥 그대로의 릴레이션

  • 사용하던 릴레이션에 속성을 잘못 추가해서 사용할 때 생길 수 있음

  • 새로 설계할 때 정규화와 무관하게 화면이나 업무 요건 문장을 그대로 릴레이션으로 설계할 때 생길 수 있음

2.7.2. 비정규형(Denormalization) 릴레이션

  • 정규형이 아닌 릴레이션


2.8. 등산과 정규화

  • 정규화를 하고 필요에 의해 비정규화를 한 모델이 비록 현행 모델과 유사하다고 할지라도, 데이터를 이해하는 정규화 과정을 거치지 않았다면 모델링을 수행한 것은 아님

  • 정규화를 하고 필요에 의해 비정규화를 한 모델이 비록 현행 모델과 유사하다고 할지라도, 데이터를 이해하는 정규화 과정을 거치지 않았다면 모델링을 수행한 것은 아님

  • 정규화를 수행함으로써 데이터의 성격에 맞는 엔터티가 설계되며, 확장성이 좋은 효과적인 모델이 됨


2.9. 정규화를 하면 좋아지는 게 무엇인가?

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

  • 데이터 성격에 맞는, 즉 함수 종속에 의해 결정된 데이터 구조는 견고하며 확장성도 뛰어남

  • 정규화를 수행하면 자연적으로 데이터 무결성은 높아짐

2.9.1. 완전성(Completeness)

  • 완전성이란 데이터 중복 등의 이상이 없는 성질

  • 정규화의 가장 커다란 목적 중 하나는 중복 데이터를 제거하는 것으로, 데이터베이스는 데이터를 관리하는 저장소이기 떄문에 데이터 이상이 없어야 완전해질 수 있음

  • 중복 데이터를 사용할수록 데이터 정합성은 저하됨

  • 어떤 경우라도 데이터를 중복시켜 정합성이 깨질 수 있도록 설계하는 것은 좋지 않음

  • 안정성과 신뢰도를 높이는 견고한 정규형 모델을 사용해야 데이터는 완전해짐

2.9.2. 확장성(Flexibility)

  • 확장성이란 업무 변화에 유연하게 대처할 수 있는 성질

  • 정규화를 하면 모델의 확장성(Flexibility)이 좋아짐

  • 또한 함수종속을 기반으로 모델 구조를 정의하기 때문에 데이터의 성격에 맞는 엔터티가 설계됨

  • 엔터티가 명확하게 정의돼 있다면 추가 업무가 발생했을 때 이미 존재하는 엔터티에 통합할지, 별도의 엔터티를 추가할지, 속성으로 추가할지가 명확해지고 그에 따른 엔터티간의 관계도 명확해짐

  • 즉 데이터 성격에 맞는, 함수 종속에 의해 결정된 데이터 구조는 견고하며 확장성도 뛰어남


2.10. 아노말리(Anomaly)란?

  • 아노말리는 데이터의 이상 현상 뜻하며, 데이터 품질을 저하시키는 주범

  • 정규화를 통해 아노말리를 근본적으로 방지 할 수 있음

2.10.1. 아노말리 개요

  • 아노말리는 데이터의 이상 현상 뜻하며, 데이터 품질을 저하시키는 주범

  • 데이터가 서로 맞지 않는 아노말리는 중복 데이터로 인해 발생

  • 중복 데이터 존재시 의도하지 않은 이상 현상이 발생 할 수 있음

  • 아노말리는 방지하는 근본적인 방법은 정규화

  • 아노말리는 애플리케이션에서 방지할 수 있으나 이는 임시방편적인 편법

  • 중복 데이터가 사용되면 언젠가는 데이터 이상 현상이 발생

2.10.2. 아노말리 종류

  • 업데이트 아노말리

    • 릴레이션에서 속성의 값을 업데이트할 때 발생하는 데이터 이상 현상

  • 삭제 아노말리

    • 릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상

  • 삽입 아노말리

    • 릴레이션에 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상현상


2.11. 정규형의 종류

  • 1정규화, 2정규화, 3정규화는 기본적으로 수행해야하는 정규화이며 정규화 대상의 대부분을 차지

  • 데이터 중복과 이상 현상(Anomaly)이 발생하므로 BC정규형, 4정규형, 5정규형 또한 중요

2.11.1. 정규형의 종류

  • 속성의 원자성 개념 기반

    • 1정규형(First Normal form)

  • 함수 종속(Functional Dependency) 개념 기반

    • 2정규형(Second Normal form)

    • 3정규형(Third Normal form)

    • 보이스코드(BC) 정규형(Boyce-Codd Normal form)

  • 다가 종속(Multivalued Dependency) 개념 기반

    • 4정규형(Fourth Normal form)

  • 조인 종속(Join Dependency) 개념 기반

    • 5정규형(Fifth Normal form)

  • 정규형 특징

  • 정규형은 일종의 체계가 존재하므로 일반적으로 3정규형을 만족한다는 것은 1정규형, 2정규형도 만족하는 것을 의미

  • 함수 종속을 사용하지 않고 직관적으로 3정규형이나 BC정규형을 도출할 수도 있음


2.12. 1정규화와 원자 값

  • 속성 값은 더 이상 쪼갤 수 없어야 하며, 하나의 값(원자 값)만을 가져야 한다는 것

  • 속성의 값이 원자 값인지에 대한 판단은 업무 요건에 따라 달라질 수 있음

2.12.1. 원자(ATOM) 값이란

  • 하나의 값을 가져야 한다는 것으로 더 이상 조갤 수 없는(UNCUT) 하나의 값만을 가져야 한다는 것을 의미

2.12.2. 여러 값을 가지는 속성

  • 다가 속성(Multivalued Attributes)

    • 같은 종류의 값을 여러 개 가지는 속성

    • 모든 속성이 하나의 값만을 가지고 있지만, 논리적으로 하나의 값이라고 볼 수 없는 경우가 있음

    • 정규화 할 시 새로운 엔터티 발생

  • 복합 속성(Composite Attributes)

    • 복합 속성은 한 속성에 여러 의미가 있는 속성

    • 여러 의미가 포함된 속성으로 하나의 속성이 여러개의 속성으로 분리될 수 있는 속성

    • 복합 속성은 업무에 따라서 판단이 달라질 수 있음

    • 정규화 할 시 새로운 속성 추가


2.13. 1정규화의 대상

  • 속성은 반드시 하나의 값을 가져야하며 반복 형태가 존재하면 안 된다는 것이 1정규형의 원칙

  • 복합 속성과 다가 속성, 중첩된 릴레이션과 같은 반복 그룹이 나타나지 말아야 1정규형을 만족

2.13.1. 1정규화 대상

  • 다가 속성이 사용된 릴레이션

    • 다가 속성은 같은 종류의 값을 여러 개 가지는 속성을 말함

    • '전화번호' 속성에 여러 전화번호 '123-4567', '234-5678' 를 관리하는 것

#고객번호 전화번호

100

123-4567, 234-5678, 345-6789

101

456-7890, 567-8901

  • 복합 속성이 사용된 릴레이션

    • 복합 속성은 한 속성에 여러 의미가 있는 속성

    • 업무 요건을 고려하여 속성을 분리

    • '고객성명' 속성을 '고객성''고객명' 두개의 속성으로 분리 하는 것

고객성명(정민호)

고객성(정)

고객명(민호)

  • 유사한 속성이 반복된 릴레이션

    • 한 릴레이션에서 반복 형태의 속성이 있는 것

#주문번호

상품번호1

주문수량1

상품번호2

주문수량2

상품번호3

주문수량3

1234

P0001

2

A0001

1

[NULL]

[NULL]

  • 한 릴레이션에서 반복 형태의 속성을 해소한 것

#주문번호

1234

#주문번호 #상품번호 주문수량

1234

P0001

2

1234

A0001

1

  • 중첩 릴레이션

    • 중첩 릴레이션(Nested Relation 또는 Relation-Valued Attribute)은 하나의 인스턴스 내부에 다시 인스턴스가 존재하는 형태

    • 물리적으로는 말생하지 않지만 논리적으로 간혹 발생

    • 중첩 릴레이션을 정규화 하는 과정은 관점에 따라 1정규형이나 2정규형을 수행 할 수 있음

  • 중복 속성이 여러 개 존재하는 릴레이션

#주문번호

#상품번호

고객번호

주문일자

주문수량

1234

P0001

100

1995-08-15

1

1234

A0001

100

1995-08-15

2

  • 중첩 릴레이션이 존재하는 릴레이션

#주문번호

#상품번호

고객번호

주문일자

주문수량

1234

P0001

100

1995-08-15

1

A0001

2

  • 동일 속성이 여러 릴레이션에 사용된 경우

    • 여러 엔터티에 동일한 성격의 속성이 존재하는 것

    • 넓은 의미로 속성이 반복 사용된 것으로 값이 다르더라도 반복 속성이 될 수 있음

    • 가장 이상적인 구조는 동일한 성격의 속성은 전사 모델에서 한 번만 존재하는 것


2.14. 1정규형과 비정규형

  • 정규형의 장점은 업무 요건의 변화에 유연하다는 것이고, 비정규형의 큰 단점은 업무 요건이 변경되면 대처하기 쉽지 않다는 것

  • 성능 문제가 있고, 반복되는 속성이 불변이라면 비정규형을 채택할 수도 있으나, 여러 가지 면을 고려했을 때 원칙에 따라 정규형을 사용하는 것이 바람직

2.14.1. 정규형과 비정규형 특징

  • 정규형

    • 업무 요건의 변경에 유연하여, 확장성이 좋은 모델

    • 인덱스 수가 감소하고, 속성을 횡(橫, 가로)으로 보여주는 화면에 대한 쿼리가 비교적 복잡해짐

    • 반복 속성이 추가될 가능성이 존재할 때 사용

    • 인스턴스 레벨로 관리되므로 데이터의 자식 엔터티를 가질 수 있음

  • 비정규형

    • 업무 요건의 변경에 매무 취약하여, 확장성이 좋지 않은 모델

    • 인덱스 수가 증가하고, 속성을 종(縱, 세로)으로 보여주는 화면에 대한 쿼리가 복잡해짐

    • 반복 속성이 추가될 가능성이 없을 때 사용할 수 있음

    • 전체 속성 레벨로 관리되므로 해당 데이터의 자식 엔터티를 가질 수 없음

2.14.2. 비정규형 사용 조건

  • 정규형 사용시 성능 문제 발생하고, 현재의 업무 요건이 불변할 때 비정규형을 사용

  • 위 두 조건을 동시에 만족하지 않으면 정규형 사용을 권장

  • 비정규형의 조회 성능이 항상 효율적이진 않음


2.15. 반복 속성으로 인한 1정규형 위반 사례

  • 반복 속성이 개별적인 의미가 없고 추가될 가능성이 없는 경우를 제외하고, 나머지의 경우는 정규화나 표준화를 해야함

  • 속성 뒤에 숫자를 붙인 엔터티는 정규화를 하지 않은 경우가 많지만 속성 명을 표준화하지 않아서 생기는 경우도 많음

  • 이력 데이터까지 고려하고, 모델의 궁극적인 확장성을 고려하면 1정규형 위반을 허용하는 경우는 거의 없는게 정상

2.15.1. 속성 명 뒤에 숫자가 붙을 때

  • 자주 발생하면서 가장 심각한 유형은 여러 속성이 묶여서 반복되는 형태(상품번호, 주문수량)

  • 여러 속성이 묶여서 반복됐다는 것은 이미 일대다(1:M)의 독립적인 데이터를 의미함

  • 쌍을 맞춰서 관리해야되는데 이를 어길 경우 데이터 무결성이 깨져 사용할 수 없는 모델이 됨

  • 인덱스 사용하기에도 매우 복잡

#주문번호 상품번호1 주문수량1 상품번호2 주문수량2 상품번호3 주문수량3

1234

P0001

2

A0001

1

[NULL]

[NULL]

2.15.2. 속성의 성격상 반복이 원천적으로 고정된 경우

  • 속성을 특정 기준으로 분리한 경우

  • 하나의 전화번호를 세 자리로 분리한 경우 각각의 의미에 맞도록 속성명을 표준화 해야함

전화번호1 전화번호2 전화번호3 지역전화번호 국전화번호 개별전화번호

2.15.3. 하나의 속성이 반복되지만, 속성 성격상 반복이 고정돼 있지 않은 경우

  • 속성이 업무적으로 반복이 고정적이지 않은 경우

  • 1정규화를 통해 1:M 관계로 관리


2.16. 2정규형

  • 2정규화는 부분 함수 종속을 제거하는 것

  • 일반 속성 중에서 후보 식별자 전체에 종속적이지 않은 속성(후보 식별자의 일부 속성에만 종속된 속성)을 찾아 기본 엔터티에서 제거하고, 그 속성의 결정자를 주 식별자로 하는 새로운 상위 엔터티를 생성하는 것

2.16.1. 2정규형 개요

  • 릴레이션의 모든 속성이 후보 식별자 전체에 종속적일 때

  • 주 식별자가 두 개 이상인 릴레이션에서 발생

  • 부분 함수 종속으로 발생한 중복 데이터를 제거하는 것이 2정규화

  • 2정규화는 후보 식별자를 구성하는 속성이 두개 이상일 때만 대상이 되고, 단일 속성일 때는 대상이 안됨

  • 즉 전체에 종속되지 않고 일부에 종속(Partial Functional Dependency)된 속성을 2정규형이 아님


2.17. 2정규형 위반인가?

  • 모델에서 속성 명이나 엔터티 명을 잘못 사용해 의도한 것과 다르게 모델을 설계하는 경우가 있는데, 이 때문에 2정규화를 하게 될 수도 있어 주의해야함

2.17.1. 2정규화에 대한 판단

  • 간혹 2정규화를 해야하는지 판단이 힘들 때가 있는데, 이는 속성 명을 명확히 붙이지 않아서 발생하기 때문에 발견하기 쉽지 않음

  • 따라서 데이터를 보고 분석해야 정확히 2정규화 대상인지를 판단할 수 있음

  • 모델에서 속성 명이나 엔터티 명을 잘못 사용해 의도한 것과 다르게 모델을 설계하는 경우가 있는데, 이 때문에 2정규화를 하게 될 수도 있어 주의해야함

  • 엔터티를 정확하게 분석해서 엔터티 명과 속성 명을 명확하게 사용하면 이런 문제는 발생하지 않을것


2.18. 3정규형

  • 3정규화는 일반 속성(비식별자 속성)간의 종속 관계를 분해하는 것

  • 3정규형의 대상이 되는 속성을 이행 종속 속성(Transitive Dependency Attribute)이라 함

  • 바로 상위의 관계(1차 관계)만을 관리하는 것이 중요하듯, 이행 종속이 아닌 직접 종속된 속성만으로 엔터티를 설계해야 함

2.18.1. 3정규형 개요

  • 3정규형은 비식별자 속성 간에 발생하는 이행적 종속성(Transitive Dependency)과 관련됨

  • 이행적 종속성은 Y가 X에 종속되고 Z가 Y에 종속되면 Z는 X에도 종속된다고 추론하는 것을 말함

  • 즉 X → Y 이고 Y → Z 이면 X → Z가 성립하며, 이때 Y느 릴레이션의 후보 식별자나 후보 식별자의 일부가 아닌 일반 속성(비식별자 속성)

2.18.2. 3정규형 예

  • {(#A#B → C , #A#B → D , C → D)} 일 때, C는 일반 속성이면서 속성 D의 결정자기도 함

  • 즉 속성 D는 주 식별자인 A와 B에 간접 종속돼 있으므로 직접적인 함수 종속에 의해서 분해돼야 함

  • 이행 종속된 속성 D와 그 속성의 결정자 역할을 하는 속성 C를 분해해서 새로운 릴레이션으로 생성

  • {(#A#B → C), (#C → D)}


2.19. BC정규형(Boyce-Codd Normal Form)

  • 3정규형을 보강한 정규형으로 모든 결정자는 주 식별자여야 한다는 정규형으로 릴레이션에 존재하는 종속자는 후보 식별자가 아니어야함

  • 함수 종속의 종속자가 후보 식별자(주 식별자를 포함한 후보 식별자)에 포함된 모델은 BC정규형을 위반한 모델

  • 모든 결정자는 엔터티의 주 식별자가 돼야 하며, 어떠한 종속자도 후보 식별자가 돼서는 안됨

2.19.1. BC정규형 개요

  • 3정규형을 보강한 정규형으로 모든 결정자는 주 식별자여야 한다는 정규형

  • 릴레이션에 존재하는 종속자는 후보 식별자가 아니어야함

  • 모든 BC정규형 릴레이션은 3정규형 릴레이션이지만, 3정규형 릴레이션이 모두 BC정규형 릴레이션을 만족하는 것은 아님

2.19.2. BC정규형 구분

  • 속성 Y에 종속된 Z가 후보 식별자에 포함되면 BC정규형이 아님

  • Z가 후보 식별자에 포함되는지에 따라 3정규형과 BC정규형이 구분됨

  • Z가 후보 식별자에 포함되더라도 일반 속성간에는 종속성이 없으므로 3정규형은 만족함

2.19.3. BC정규형 예

  • {(#A#B → C, #A#B → D, C → #B)} 일 때, 일반 속성 C에 종속된 종속자 #B가 주식별자에 포함돼 있으므로 BC 정규형에 어긋나지만 일반 속성(C, D) 사이에는 종속 관계가 없으므로 3정규형은 만족함

  • BC 정규형을 만족하기 위해서 주식별자 #B 를 일반속성으로 변경하고 일반 속성 C를 주식별자로 변경하며, 속성 C와 B를 분해해서 새로운 릴레이션으로 생성

  • {(#A#C → D), (#C → B)}


2.20. 4정규형

  • 다가 종속 개념이 기반이 되는 정규형으로 다가 종속을 분리하는 것

  • 다가 종속이 발생하여 M*N 만큼 인스턴스가 생성돼 중복 데이터 발생

  • 서로 관계가 없는 다가 속성 간에 종속성이 생긴 릴레이션은 많은 중복 데이터가 생기기 때문에 4정규화를 하여 중복 데이터를 제거해야 함

2.20.1. 4정규형 개요

  • 다가 종속 개념이 기반이 되는 정규형으로 이를 이해하려면 다가 종속(MVD; Multivalued Dependency)을 이해해야 함

  • 다가 종속은 한 릴레이션에 다가 속성이 두 개 이상 존재할 때 발생할 수 있으며, 다가 속성 값 사이에 다대다(M:M) 관계가 발생 하는 것

  • 데이터를 정확하고 효율적으로 관리할 수 있도록 해주며 데이터 사용 공간도 절약

  • 서로 관계가 없는 다가 속성 간에 종속성이 생긴 릴레이션은 많은 중복 데이터가 생기기 때문에 4정규화를 하여 중복 데이터를 제거해야 함

  • 1정규화와 유사하나 1정규화는 다가 속성을 엔터티로 분해하는 것이고 4정규화는 서로 관련이 없는 다가 속성을 개별 엔터티로 분해하는 것으로 다가 속성을 1정규형으로 만들면 다가 종속은(MVD)은 자연히 제거됨

2.20.2. 4정규형 발생 조건

  • 하나의 A 값에 대응하는 여러 개의 B 값이 있고 A 값에 대응하는 여러 개의 C 값이 있으며, B 값과 C 값 사이에는 아무런 상관관계가 없는데 A, B, C 값을 하나의 릴레이션에서 관리할 때 다가 종속이 발생

  • 즉 두 개의 독립적인 일대다(1:M) 관계의 속성이 하나의 릴레이션에 존재하면 다가 종속이 발생

2.20.3. 다가 종속 예

  • 아래 표는 사원은 두 명 이지만 이름이 열번 존재하고 '홍길동’의 기술과 언어는 두 개인데 네 건의 데이터가 존재

  • 사원과 기술, 사원과 언어라는 두개의 다가 속성을 하나의 릴레이션에서 관리하기 때문

#사원 #기술 #언어

홍길동

모델링

영어

홍길동

모델링

한국어

홍길동

튜닝

영어

홍길동

튜닝

한국어

강길동

자바

한국어

강길동

자바

일어

강길동

C++

한국어

강길동

C++

일어

강길동

.Net

한국어

강길동

.Net

일어

2.20.4. 다가 종속 해소 예

  • 기술과 언어 사이에 직접적인 연광이 없고, 단지 한 사원에 속해 있어 간접적인 연관 관계만 존재

  • 즉 어떤 기술이 어떤 언어와 쌍이 되는지 중요하지 않으므로 두개의 릴레이션으로 분해

#사원 #기술 #사원 #언어

홍길동

모델링

홍길동

영어

홍길동

튜닝

홍길동

한국어

강길동

자바

강길동

한국어

강길동

C++

강길동

일어

강길동

.Net

-

-


2.21. 5정규형

  • 더 이상 쪼갤 수 없도록 릴레이션을 쪼갠 릴레이션으로, 데이터가 변질되지 않는 한 엔터티를 최대로 분해하는 것

  • 5정규형은 지나치게 이론적이며 DBMS에서 실제로 사용하기에는 부적합하지만, 오히려 실무에서 효율적이지 않기 때문에 실익이 없는 5정규형을 사용하지 않기 위해서라도 구분할 수 있어야함

2.21.1. 5정규형 개요

  • 조인 종속(Join Dependency) 개념 기반으로 조인 종속이 없는 릴레이션

  • 어떤 릴레이션을 분해(정규화)한 다음에 조인해서 다시 원래의 릴레이션으로 복원할 수 있다면, 그 릴레이션은 조인 종속이 존재하는 릴레이션

  • 무손실 분해와 비부가적 분해가 되도록 분해한 릴레이션이 5정규형

  • 5정규형은 릴레이션을 분해하고(Project) 합치는(Join) 개념 때문에 PJ정규형(Project-Join Normal Form)이라고도 함

  • 5정규형은 3개체 관계(Ternary Relationships)와 연관됨

  • 3개체 관계가 발생한 릴레이션은 일반적으로 세 개의 릴레이션으로 분해할 수 있으며, 세 개의 릴레이션으로 분해하면 5정규형을 만족함

2.21.2. 무손실 조인(Lossless Join)과 비부가적 조인(Nonadditive Join)

  • 하나의 릴레이션을 여러 개의 릴레이션으로 분해한 후 공통(식별자) 속성으로 조인하여 데이터 손실 없이 원래의 릴레이션으로 복원할 수 있으면, 이를 '무손실 조인’이라함

  • 조인한 결과에 원래 릴레이션에 없던 데이터(가짜 튜플)가 존재하지 않으면 이를 '비부가적 조인’이라함

  • '무손실 분해’란 필요한 데이터가 사라지지 않도록 분해하는 것을 뜻하고, '비부가적 분해’란 필요 없는 데이터가 생기지 않는 것을 뜻함


2.22. 정규화 요약

  • 릴레이션에 제거 대상이 존재하면 정규화 수행

  • 제거해야 하는 이유를 알고 어떻게 제거하는지를 알면 정규화는 수월하게 할 수 있음

  • 더이상 제거할 것이 없는 모델이 가장 이상적인 모델

2.22.1. 정규화 요약

구분 제거 대상 특징

1정규화

다가·복합 속성 제거, 반복 속성 제거, 중첩 릴레이션 제거

속성이 추가되거나 일대다(1:M) 관계의 엔터티가 추가되며 관계를 상속시킴

2정규화

부분 종속 제거

일대다(1:M) 관계의 엔터티가 추가되며 관계를 상속받음

3정규화

이행 종속 제거

일대다(1:M) 관계의 엔터티가 추가되며 관계를 상속받음

BC정규화

종속자가 키에 포함된 함수 종속 제거

모든 결정자는 키이어야 한다는 관점에서 3정규형과 같음

4정규화

다가 종속 제거

다가 속성의 개수만큼 일대다(1:M) 관계의 엔터티가 추가되며 관계를 상속시킴

5정규화

조인 종속 제거

조인 종속이 존재하는 엔터티가 오히려 사용하기 편함. 지나치게 이상정

2.22.2. 1정규화 요약

  • 정규화 수행 조건

    • 릴레이션에 다가 속성, 복합속성, 반복 속성, 중첩 릴레이션 같은 제거 대상이 존재하면 1정규화 수행

  • 정규화 순서

    • 제거해야 하는 속성을 엔터티에서 제거

    • 제거한 속성이 포함된 새로운 엔터티를 만듬

    • 기존 엔터티에서 새로운 엔터티로 관계를 상속

2.22.3. 2정규화 요약

  • 정규화 수행 조건

    • 릴레이션에 존재하는 부분 종속을 제거하는 것이 2정규화

  • 정규화 순서

    • 제거해야 하는 속성을 엔터티에서 제거

    • 제거한 속성이 포함된 새로운 엔터티를 만듬

    • 새로 만든 엔터티에서 기존 엔터티로 관계(식별관계)를 상속

    • (관계 속성은 주 식별자에 포함되며, 관계가 식별 관계(Identifying Relationship))

2.22.4. 3정규화 요약

  • 정규화 수행 조건

    • 이행 종속을 제거하는 것이 3정규화

  • 정규화 순서

    • 제거해야 하는 속성을 엔터티에서 제거

    • 제거한 속성이 포함한 새로운 엔터티를 만듬

    • 새로 만든 엔터티에서 기존 엔터티로 관계(비식별 관계)를 상속

  • (상속한 관계가 일반속성이 되며, 관계는 비식별 관계(Non-Identifying Relationship))

2.22.5. BC정규화 요약

  • 정규화 수행 조건

    • 후보 식별자가 종속자가 된 함수 종속을 제거하는 것이 BC정규화

  • 정규화 순서

    • 후보 식별자 속성 중 종속자 속성을 엔터티에서 제거

    • 제거한 속성과 그 속성의 결정자 속성으로 새로운 엔터티를 만듬

    • 새로 만든 엔터티에서 기존 엔터티로 관계를 상속

2.22.6. 4정규화 요약

  • 정규화 수행 조건

    • 다가 종속을 제거하는 것이 4정규화

  • 정규화 순서

    • 제거해야 하는 대상인 다가 종속에 포함된 속서을 엔터티에서 제거

    • 제거한 속성이 포함된 새로운 엔터티를 다가 속성 개수만큼 만듬

    • 기존 엔터티와 새로 만든 엔터티와의 교차 관계 엔터티를 만듬

2.22.7. 5정규화 요약

  • 정규화 수행 조건

    • 조인 종속을 제거하는 것이 5정규화

  • 정규화 순서

    • 데이터가 변질되지 않는한 엔터티를 최대로 분해


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

  • 업무 요건에 따라 정규화를 수행하고 나서, 성능 관점에서 필요에 따라 비정규형을 선택할 수 있을 뿐 정규화를 제한하는것은 올바른 접근 방법이 아님

2.23.1. 3정규화까지 수행에 대한 고찰

  • 3정규화까지가 정규화의 대다수를 차지하기 때문에 3정규화까지 하면 대부분의 중복은 해결할 수 있음

  • 3정규화에 비해 어려운 BC정규화, 4정규화, 5정규화 난이도

  • BC 정규화 이상으로 수행할 시 쿼리(조회)가 어렵다고 생각하기 때문

2.23.2. 정규화에 대한 고찰

  • 정규화를 하는 이유는 중복 데이터를 제거하여 데이터 이상현상을 최소화하려는 것

  • 업무 요건에 따라 정규화를 수행하고 나서, 성능 관점에서 필요에 따라 비정규형을 선택할 수 있을 뿐 정규화를 제한하는것은 올바른 접근 방법이 아님

  • 다만 이론에 의해 최대한 분해한 5정규형은 실익이 없고, 5정규화를 하지 않는다고 해서 업무 요건을 저해하는것도 아니며, 중복 데이터가 생기는 것도 아님


2.24. 정규형과 성능

  • 쓰기 성능은 일반적으로 정규형의 성능이 좋으며, 조회 성능은 요건에 따라서 비정규형의 성능이 더 나빠질 수 있음

  • 사소한 성능 향상을 위해 데이터 무결성을 저해하는 것은 소탐대실일 것

2.24.1. 정규화에 따른 조회 성능 저하에 대한 오해

  • 정규화하여 엔터티를 분해하였을 때 조인하는 과정에서 사용하는 블록이 능어남으로써 성능에 나쁜 영향을 미침

  • 따라서 일반적인 조회 요건이라면 미세하게라도 정규형이 비정규형보다 조회 성능이 떨어질 가능성이 높음

  • 다만 정규화를 하면 중복 데이터가 최소화되고 인스턴스의 크기가 작아지므로, 한 블록(8Kbytes)에 저장하는 인스턴스는 많아지게됨

  • 이 점이 여러 건의 조회뿐만 아니라 한 건의 조회에도 특정 속성을 조회할 때는 정규형의 성능이 좋아질수 있는 원인

  • 정규화의 기본 개념이 함수 종속이므로 종속성, 의존성이 같은 데이터(성격이 같은 데이터)는 업무에서 같이 조회될 가능성도 커져 최소의 블록을 사용하는 효과를 얻게됨

  • 그로인해 블록이 다시 사용될 가능성(확률)이 커짐으로써 메모리에 존재하는 블록을 조회할 메모리 적중률(Hit Ratio)이 높짐으로써 성능이 좋아짐

2.24.2. 정규화에 따른 쓰기 성능 향상

  • 조회 성능과는 다르게 쓰기 성능(Insert, Update, Delete)이 좋다는 것은 중복 속성이 없기 때문

  • 비정규형은 어떤식으로든 중복 데이터를 사용하며, 한 속성을 다루는게 아니라 여러 속성을 다루기 때문에 쓰기 시간이 오래 걸림