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 그냥 릴레이션에서 주 식별자가 계좌번호이기 때문에 고객과 연관된 속성을 제거하였다.
- 정규화 과정을 거친 그림2.2 정규형 릴레이션에 고객 속성을 중복 속성으로 추가한 릴레이션이다.
- 정규형 릴레이션으로 설계한 후, 성능 문제 등의 이유가 있을 때 비정규형 릴레이션을 설계할 수 있다.
- 반드시 비정규형 릴레이션은 정규형화 과정을 거쳐야 한다.
h3.2.8 등산과 정규화
- 완전한 정규형 모델을 구축하려면 많은 노력이 든다.
- 정규화 과정을 통해 데이터를 완전히 이해한 상태에서 비정규화 수행은 많은 노력이 들지 않는다.
- 등산의 목적이 산 정상에 올라가는 것과 같이, 모델러라면 반드시 정규화를 수행해야 한다.
h3.2.9 정규화의 이(利)점
- 데이터의 완전성(Completeness)을 지킬 수 있다.
- 정규화로 중복 데이터를 제거하므로서 데이터 정합성이 향상된다.
- 중복 속성의 사용
- 그럼2.4에서 엔터티 장바구니, 관심상품, 주문상품, 상품에 중복으로 상품명 속성이 존재한다.
- 만약 상품명이 바뀌면 모든 엔터티의 상품명 속성 값을 수정해야 한다.
- 중복 데이터는 여러 군데 쓰일수록 변질되기 쉽다.
정규화의 가장 큰 목적은 중복 데이터를 제거해서 데이터를 완전하게 관리하는 것이다.
- 모델의 확정성(Flexibility)이 좋아진다.
- 함수 종속을 기반으로 속성을 결정자와 종속자로 구분해 모델 구조를 정의하기 때문에 데이터의 성격에 맞는 엔터티가 설계된다.
- 업무가 확장돼도 그에 맞는 모델 구조로 확장하기 쉬워지므로 업무 변화에 유연한게 대처할 수 있다.
- 그 밖에 이점
- 데이터 무결성이 높아진다.
- 데이터 저장 공간의 사용을 최소할 수 있기 때문에 성능을 향상 시킬 수 있다.
- 데이터 모델 관리가 쉽다.
h3.2.10 아노말리(Anomaly)
- 중복 데이터 때문에 발생하며, 다음과 같은 아노말리가 발생할 수 있다.
구분 | 내용 |
---|
업데이트 아노말리 | 릴레이션에서 속서의 값을 업데이트할 때 발생하는 데이터 이상 현상 |
삭제 아노말리 | 릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상 |
삽입 아노말리 | 릴레이션에 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상 현상 |
h3.2.11 정규형의 종류
- 1정규형(First Normal Form)
- 2정규형(Second Normal Form)
- 3정규형(Third Normal Form)
- BC정규형(Boyce-Codd Normal Form)
- 4정규형(Forth Normal Form)
- 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정규형으로 설계해야 한다.
- 엔터티만 봐서는 여러 값을 저장했는지 알 수 없기 때문에 반드시 값을 봐야 알 수 있다.
- 만약 데이터 타입의 길이가 길다면 추측할 수도 있다.
- NFNF 릴레이션
- 모든 속성이 하나의 값만을 가지고 있지만, 논리적으로는 하나의 값이라고 볼 수 없는 경우이다.
- 물리적으로는 1정규형이라고 볼 수 있지만, 논리적으로는 1정규형이 아니다.
- 또한, 2정규형 원칙 위반이다.
- 그림2.11의 정규화
- 같은 성격의 데이터를 여러 속성으로 나열해 관리하느 것도 논리적으로 여러 값을 관리하는 것이다.
- 고객 엔터티의 전화번호 속성은 원자 값이 아니다.
- 그림2.12의 정규화
- 복합 속성(Composite Attributes): 하나의 속성이 여러 개의 속성으로 분리되는 것을 의미한다.
- 업무 요건에 따라 속성의 관리 수준이 달라질 수 있다.
- 예) 이름(성+이름), 주소(시+구+동), 날짜(연+월+일)
h3.2.13 1정규화의 대상
- 다가 속성이 사용된 릴레이션
- 복합 속성이 사용된 릴레이션
- 유사한 속성이 반복된 릴레이션
- 중첩 릴레이션
- 동일 속성이 여러 릴레이션에 사용된 경우
- 중첩 릴레이션: 하나의 인스턴스 내부에 다시 인스턴스가 존재하는 행태이다.
- 동일 속성이 여러 릴레이션에 사용된 경우
- 여러 엔터티에 동일한 성격의 속성이 존재하는 것
- 예) 개인고객과 법인고객 엔터티에 모두 전화번호 속성이 존재하는 것
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정규형
- 다가 종속(MVD: Multivalued Dependency): 한 릴레이션에 다가 속성이 두 개 이상 존재할 때, 하나의 다가 속성 값이 다른 다가 속성의 모든 값마다 중복되는 것이다.
h3.2.20 5정규형
- 조인 종속(Join Dependency): 어떤 릴레이션을 분해한 다음에 조인해서 다시 원래의 릴레이션으로 복원할 수 있는 것이다.
- 실무에서 사용하는 정규화는 단순히 릴레이션을 분해하는 것이 목적이 아니라, 중복이 발생하지 않도록 분해해서 데이터 무결성을 높이는 것이 목적이다.
h3.2.21 정규화 요약
- 1정규화 수행 순서
- 제거해야 하는 속성을 언터티에서 제거한다.
- 제거한 속성이 포함된 새로운 엔터티를 만든다.
- 기존 엔터티를에서 새로운 엔터티로 관계를 상속한다.
※ 추가 엔터티가 생기면서 기존 엔터티에서 추가 엔터티로 관계를 상속하는 것이 핵심이다.
- 2정규화 수행 순서
- 제거해야 하는 속성을 엔터티에서 제거한다.
- 제거한 속성이 포함된 새로운 엔터티를 만든다.
- 새로 만든 엔터티에서 기존 엔터티로 관계(식별 관계)를 상속한다.
- 3정규화 수행 순서
- 제거해야 하는 속성을 엔터티에서 제거한다.
- 제거한 속성이 포함한 새로운 엔터티를 만든다.
- 새로 만든 엔터티에서 기존 엔터티로 관계(비식별 관계)를 상속한다.
- BC정규화 수행 순서
- 후보 식별자 속성 중 종속자 속성을 엔터티에서 제거한다.
- 제거한 속성과 그 속성의 결정자 속성으로 새로운 엔터티를 만든다.
- 새로 만든 엔터티에서 기존 엔터티로 관계를 상속한다.
- 4정규화 수행 순서
- 제거해야 하는 대상인 다가 종속에 포함된 속성을 엔터티에서 제거한다.
- 제거한 속성이 포함된 새로운 엔터티를 다가 속성 개수만큼 생성한다.
- 기존 엔터티와 새로 만든 엔터티와의 교차 관계 엔터티를 만든다.
h3.2.22 3정규화까지만 수행하면 된다?
- 3정규화까지만 수행하면 된다고 생각하는 이유
- 3정규화까지 하면 대다수의 중복을 해결할 수 있기 때문이다.
- BC정규화, 4정규화, 5정규화는 어렵기 때문이다.
- BC정규형 이상을 채택하면 조회(쿼리)가 어렵다고 생각하기 때문이다.
{tip:title=정규화를 하는 이유는 중복 데이터를 제거하여 데이터 이상 현상(아노말리)을 최소하려는 것이지, 사용하기 편하게 하기 위한 것은 아니다.}
{tip}
- 정규화는 업무 요건에 맞게 함수 종속성을 따져 데이터 중복을 제거하는 것이다.
- 몇 정규화까지만 수행해야 하는지를 논하는 것은 의미가 없고, 단지 업무 요건대로 정규화하는 것이 의미 있다.
- 5정규화는 하지 않다고 해서 업무 요건을 저해하는 것도 아니며, 중복 데이터가 생기는 것이 아니기 때문에 예외이다.
- 4정규화는 업무 요건과 관련 있기 때문에 4정규화까지 하면 된다.
h3.2.23 정규형과 성능
- 정규화의 단점
- 엔터티를 분해한 후 조인한면 사용하는 블록이 늘어나기 때문에 성능에 나쁜 영향을 준다.
- 개발하기 까다롭고 불편하다.