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

04 정규화 (Normalization)

by manga0713 2019. 9. 15.

 

 

[ Normalization Process: Data Normalization & Serialozation - Josh Nguyen ]

 

 

 

 

4.1. 정규화(Normalization)란?

 

 

- 정규화는 속성간의 부정확한 종속성을 없애는 것을 의미한다.

 

- 함수 종속 개념을 기반으로 유사한 속성들을 모으고 종속성이 없는 독립적인 속성들은 분리하는 것이 정규화다.

 

- 속성의 종속성과 의존성을 분석해 더는 분해(Decomposition)될 수 없는 엔터티로 만드는 과정이다.

 

- 정규형은 아노말리(Anormaly: 데이터 이상현상, 업데이트 아노말리, 삭제 아노말리, 삽입 아노말리) 현상을 최소화한다.

 

 

 

 

[ 중복 속성(상품명)이 사용된 모델 ]

 

 

 

- 위 그림의 모델에서 상품코드가 '101011'인 상품의 이름이 바뀌면, 상품 엔터티에 존재하는 상품명 속성값만 수정해선 안 된다. '101011'인 상품이 장바구니, 관심상품, 상품 엔터티에 존재하면 상품명 속성 값을 수정해야 한다. 만약 값이 하나라도 틀리면 상품명 값의 정합성이 깨져 혼선이 발생할 것이다.

 

 

 

4.2. 정규화의 목적

 

 

- 안정성과 확장성 제고가 정규화를 수행하는 가장 커다란 목적이다.

 

- 엔터티가 명확하게 정의돼 있다면 추가 업무가 발생했을 때 이미 존재하는 엔터티에 통합할지, 엔터티를 추가할지, 속성을 추가할지가 명확해지고 그에 따른 엔터티 간의 관계도 명확해진다. 업무가 확장돼도 그에 맞는 모델 구조로 확장하기 쉬워지므로 업무 변화에 유연하게 대처할 수 있다.

 

- 정규형을 사용하면 데이터 저장 공간의 사용을 최소화할 수 있으며 데이터 모델을 단순화할 수 있다. 일반적으로 데이터의 저장 공간이 최소화되면 성능에 도움을 준다.

 

 

4.3. 아노말리(Anormaly)

 

 

- 아노말리는 중복된 데이터 때문에 발생하는 데이터의 이상 현상이다.

  • 업데이트 아노말리(Update Anormaly): 릴레이션에서 속성의 값을 업데이트할 때 발생하는 데이터 이상 현상
  • 삭제 아노말리(Deletion Anormaly): 릴레이션에서 인스턴스를 삭제할 때 발생하는 데이터 이상 현상
  • 삽입 아노말리(Addition Anormaly): 릴레이션에 새로운 인스턴스를 삽입할 때 발생하는 데이터 이상 현상

 

 

 

[ 아노말리가 발생할 수 있는 릴레이션 ]

 

 

 

- 위의 릴레이션에는 많은 데이터가 중복돼 있다.

  • 업데이트 아노말리: '홍길동'이라는 선수가 포지션을 '2루수'로 바꾸면 세 개의 인스턴스를 찾아 포지션 속성의 값을 '2루수'로 업데이트해야 한다. 이런 형태의 업데이트는 릴레이션의 전체 인스턴스 개수가 수천만 건 등으로 많다면 문제가 될 수도 있다.
  • 삭제 아노말리: '김길동'에 대한 데이터를 삭제하려고 하면 선수 이름이 '김기롱'인 두 개의 인스턴스가 삭제되는데, 의도한 대로 두 개의 인스턴스가 삭제돼도 데이터에 문제가 발생한다. '엘리펀츠'와 '타이거즈' 팀의 데이터가 같이 삭제된 것이다. 실제로는 팀 데이터를 별도로 관리하는 릴레이션이 존재할 것이다.
  • 삽입 아노말리: '장길동'이라는 새로운 선수가 등장해서 선수로 등록하고 선수번호는 '16'번이 됐다. 이 선수를 위의 릴레이션에 입력하려고 하는데 문제는 팀이 아직 결정되지 않았다는 것이다. 선수는 존재하는데 소속팀이 정해지지 않아서 위 릴레이션에는 입력할 수가 없다. 왜냐하면 팀ID 속성이 주 식별자이기 때문이다. 주 식별자 속성은 Null 값을 가질 수 없다. 그래서 '장길동'의 팀이 정해지기 전까지는 입력을 기다려야 한다.

 

- 위의 릴레이션은 아래의 릴레이션과 같이 정규화하여 하나의 주제만을 저장해야 한다.

 

 

 

[ 정규형 릴레이션 ]

 

 

 

 

4.4. 함수 종속(Functional Dependency)

 

 

- 데이터 종속성에는 함수 종속(Functional Dependency), 다가 종속(Multivalued Dependency), 조인 종속(Join Dependency) 등이 존재하는데 대표적인 종속성은 함수 종속이다.

 

- 함수 종속은 릴레이션 내에 존재하는 속성 간의 종속성을 의미한다.

 

- 어떤 집합이든 그 집합을 대표할 수 있는 속성은 존재한다. 대표 속성(식별자)과 나머지 속성 사이의 연관 관계가 함수 종속이다.

 

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

 

- 함수 종속은 속성 간의 종속성을 규명해 집합을 분리하므로 속성과 엔터티를 정의하고 관계를 파악하는 데 절대적인 역할을 한다.

 

- 함수 종속은 업무 요건에 종속된다. 한 속성이 다른 속성을 유일하게 식별할 수 있는지는 업무 요건에 따라 달라진다.

 

- 결정자(Determinant): 속성 간의 종속성을 규명할 때 기준이 되는 값

 

- 종속자(Dependent): 결정자의 값에 의해 정해지는 값

 

- 결정자 X의 값은 반드시 하나의 Y값과 연관된다. X 값에 의존하는 Y 값은 하나뿐이지 다른 Y 값이 있을 수 없다. 이때 X는 Y를 함수적으로 결정한다고 하며 기호로는 X --> Y, 또는 y = f(x)라고 표현한다.

 

X → Y

 

 

 

- 예를 들어 주민등록번호, 이름, 휴대전화번호, 주소로 이루어진 릴레이션이 있다면 주민등록번호는 결정자가 될 수 있다. 왜냐하면 주민등록번호를 알면 나머지는 하나만 유일하게 결정되기 때문이다. 즉 이름, 휴대전화번호, 주소는 주민등록번호에 함수적으로 종속돼 있다.

 

- 주문번호, 주문일자, 고객번호, 상품코드, 고객명, 상품명으로 구성된 릴레이션이 있을 때 이 속성간의 함수 종속(FD)을 전부 도출하면 다음과 같다.

  • FD1: 주문번호 → 주문일자
  • FD2: 주문번호 → 고객번호
  • FD3: 주문번호 → 상품코드
  • FD4: 고객번호 → 고객명
  • FD5: 상품코드 → 상품명

 

- 주문번호를 알면 언제 주문했는지(FD1), 누가 주문했는지(FD2), 그리고 어떤 상품을 주문했는지(FD3)를 알 수 있다. 고객번호를 알면 그 고객의 이름(FD4)을, 상품코드를 알면 상품명(FD5)을 알 수 있다. 위의 5개 이외에 존재하는 함수 종속은 없다.

 

- X → Y와 같이 속성 간의 종속(직접 종속) 관계가 발생하면 X와 Y는 항상 함께 존재해야 한다. 따라서 위와 같은 함수 종속(FD)에 근거해 다음과 같은 엔터티가 생성된다. 모든 FD의 결정자는 엔터티의 주 식별자가 돼야 한다.

  • 엔터티1: #주문번호, 주문일자, 고객번호, 상품코드
  • 엔터티2: #고객번호, 고객명
  • 엔터티3: #상품코드, 상품명

 

- 함수 종속은 일반적으로 직접 종속을 의미한다.

 

- 함수 종속은 키(Key)와 밀접한 연관이 있다. 함수 종속의 결정자(Determinant)가 키(Key)가 되도록 릴레이션을 분해(Decomposition)하는 과정이 정규화이기 때문이다.